Перейти к основному содержимому

Структура 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 задает аргументы по умолчанию.