Docker build
Docker build - механизм, позволяющий создавать частные docker-образы с необходимым наполнением.
Файл Dockerfile
Это текстовый файл, содержащий набор инструкций для создания Docker образа. Эти инструкции описывают, как собрать образ, какие файлы и зависимости включить в образ, а также как настроить окружение контейнера. Вот типичная структура Dockerfile:
# Комментарии начинаются с символа #
# Указываем базовый образ, на котором будет основан наш образ
FROM ubuntu:20.04
# Метаданные образа (необязательно)
LABEL maintainer="your-email@example.com"
# Выполняем команды внутри образа
RUN apt-get update && apt-get install -y \
package1 \
package2
# Копируем файлы из хостовой системы в образ
COPY ./app /app
# Задаем рабочую директорию для последующих команд. Рекомендуется создавать для своих приложений
# отдельную корневую папку и туда помещать все файлы приложения, например: папку /app. Также после
# выполнения команды WORKDIR docker автоматически перейдет в эту папку и все последующие команды будет выполнять из нее.
WORKDIR /app
# Задаем переменные окружения
ENV MY_VARIABLE=my_value
# Открываем порт, который контейнер будет прослушивать. На деле, порт в контейнере должен быть окрыт определенным процессом,
# а данная обцая просто сообщает разработчику об этом, но реально порт не открывает. Рекомендуется использовать для наглядности.
EXPOSE 80
# Запускаем команду при запуске контейнера.
CMD ["command", "arg1", "arg2"]
# CMD [ "python", "main.py"]
# задается команда на выполнение внутри контейнера. В первых кавычках указывается исполняемый файл, в последующих - параметры с которыми этот файл должен быть запущен.
# В данном примере, после создания контейнера, будет запущен процесс python в котором будет открыт файл с кодом main.py.
# Соответственно, данный файл должен быть скопирован в рабочую директорию контейнера на этапе COPY.
Контекст сборки (build context) в Docker
Контекст сборки (build context) в Docker - это набор файлов и директорий, которые Docker CLI отправляет на Docker-демон вместе с инструкциями Dockerfile при выполнении команды docker build. Контекст сборки представляет собой все файлы, необходимые для построения образа Docker.
При выполнении команды docker build, Docker CLI отправляет контекст сборки на Docker-демон. Затем Docker демон использует этот контекст для построения образа в соответствии с инструкциями, указанными в Dockerfile. Контекст сборки включает в себя Dockerfile и все файлы, на которые Dockerfile ссылается с помощью инструкций COPY и ADD.
Эффективное управление контекстом сборки является важным аспектом создания образов Docker. Он может повлиять на производительность сборки и размер итогового образа. Рекомендуется минимизировать размер контекста сборки, исключая ненужные файлы и директории, чтобы сократить время передачи контекста на Docker-демон и уменьшить размер образа.
Контекст сборки указывается как последний аргумент в команде docker build.
docker build -t myimage:latest . # В этой команде . означает текущий каталог,
# и все файлы и директории из текущего каталога будут включены в контекст сборки.
docker build -f . # можно принудительно указать имя для докер-файла. Актуально, если имя отличается от Dockerfile.
cmd vs entrypoint
Инструкция ENTRYPOINT
Инструкция ENTRYPOINT в Dockerfile используется для указания исполняемого файла или команды по умолчанию, которая должна быть запущена при старте контейнера.
Она позволяет определить основную цель контейнера и задать команду, которая будет выполняться по умолчанию.
Инструкция ENTRYPOINT имеет две формы: форма exec, которая использует синтаксис массива JSON, и форма shell, которая принимает команду и ее параметры в виде одной строки.
# Синтаксис:
ENTRYPOINT [“executable”, “param1”, “param2”]
# или
ENTRYPOINT command param1 param2
Инструкция CMD
Инструкция CMD используется для предоставления аргументов по умолчанию инструкции ENTRYPOINT или для определения команды по умолчанию, которая будет выполняться при запуске контейнера, если ENTRYPOINT не задан.
В отличие от ENTRYPOINT, CMD не определяет основную цель контейнера; вместо этого она обеспечивает поведение по умолчанию, которое можно легко отменить.
Подобно ENTRYPOINT, CMD также имеет форму exec и форму shell.
Различия между ENTRYPOINT и CMD
- Назначение: ENTRYPOINT используется для определения основной цели контейнера, в то время как CMD обеспечивает поведение по умолчанию, которое может быть переопределено.
- Переопределение: При запуске контейнера вы можете легко переопределить инструкцию CMD, предоставив дополнительные аргументы командной строки, в то время как инструкцию ENTRYPOINT нельзя переопределить, если она явно не указана с помощью флага -entrypoint.
- Взаимодействие: Если в Dockerfile указаны и ENTRYPOINT, и CMD, инструкция CMD предоставляет аргументы по умолчанию для инструкции ENTRYPOINT.
Комбинирование ENTRYPOINT и CMD
Используя ENTRYPOINT и CMD вместе в Dockerfile, вы можете создавать гибкие образы контейнеров, которые имеют четко определенную цель и настраиваемое поведение.
При совместном использовании инструкция ENTRYPOINT определяет команду по умолчанию, которая будет выполняться, а инструкция CMD предоставляет аргументы по умолчанию для этой команды.
В этом примере инструкция ENTRYPOINT указывает, что контейнер должен выполнить команду ping.
Инструкция CMD предоставляет аргумент по умолчанию “localhost”.
Когда вы запускаете контейнер без дополнительных аргументов, он выполнит команду ping localhost. Однако если при запуске контейнера в качестве аргумента указать другое имя хоста или IP-адрес, он отменит инструкцию CMD и выполнит ping указанной цели.
Заключение
Понимание различий между ENTRYPOINT и CMD в Dockerfiles необходимо для создания эффективных и гибких образов контейнеров.
ENTRYPOINT позволяет определить основную цель контейнера, в то время как CMD обеспечивает поведение по умолчанию, которое можно легко переопределить.
Комбинируя обе инструкции, вы можете создавать универсальные образы контейнеров, которые служат конкретной цели и при этом настраиваются под различные случаи использования.