Структура Dockerfile
Типовые инструкции Dockerfile:
# Указывает с какого образаа брать сборку.
FROM ubuntu:20.04
# Указывает от какого пользоватя (и опционально группы) запускаются дальнейшие команды.
USER ronin:staff
# Информирует что образ слушает порт 8080 по протоколу tcp.
EXPOSE 8080/tcp
# Указывает из какой директории выполнять дальнейшие инструкции.
# Если указан относительный путь, он будет применяться относительно предыдущих инструкций WORKDIR.
WORKDIR application
# Определяет перменную, оторую пользователь может передат ь при запуске `docker build --build-arg <varname>=<value>`.
ARG PROFILE=docker
# Копирует файлы с host-машины в образ, доступны wildcards, --chmod user:user.
# ADD умеет распаковывать архивы, но в документации советуют использовать COPY, где магия ADD не требуется.
ADD https://github.com/Netflix/eureka/archive/refs/tags/v1.10.17.zip /app/eureka
COPY build/libs/order-service.jar /app/order-service.jar
# Задает переменные окружения. Переменная окружения будет определена для запущенного контейнера
ENV SPRING_PROFILES_ACTIVE=$PROFILE
# выполняет каждую команду в новом слое поверх текущего слоя.
RUN apt-get update && \
apt-get install openjdk-17-jdk -y
# Позволяет описывать контейнер как исполняемый.
# * ENTRYPOINT описывает команду, которая всегда будет выполняться при старте контейнера;
# * CMD определяет аргументы, которые будут переданы в ENTRYPOINT.
ENTRYPOINT ["/bin/ping"]
CMD ["google.com"]
Если во время выполнения определена только одна из инструкций, то и CMD и ENTRYPOINT будут иметь одинаковый эффект.
ENTRYPOINT имеет два режима выполнения:
ENTRYPOINT["/bin/ping", "localhost"] (exec, предпочтительно);ENTRYPOINT /bin/ping localhost(shell).
Режим exec является рекомендуемым. Это связан о с тем, что контейнеры задуманы так, чтобы содержать один процесс.
Например, отправленные в контейнер сигналы перенаправляются процессу, запущенному внутри контейнера с идентификатором
PID == 1.
Но в режиме exec нельзя воспользоваться переменными среды ($PATH и т.п.), поэтому нужно писать полные пути к
исполняемым файлам.
Аргументы CMD присоединяются к концу инструкции ENTRYPOINT:
- Если вы используете режим shell для
ENTRYPOINT,CMDигнорируется. - При использовании режима exec для
ENTRYPOINTаргументыCMDдобавляются в конце. - При использовании режима exec для инструкции
ENTRYPOINTнеобходимо использовать режим exec и для инструкцииCMD.
Кратко по ролям инструкций:
FROMзадает базовый образ;WORKDIRзадает рабочую директорию;COPY/ADDдобавляют файлы;RUNсоздает новый слой во время сборки;ENVзадает переменные окружения;ENTRYPOINTзадает исполняемую команду контейнера;CMDзадает аргументы по умолчанию.