логотип PurpleSchool
логотип PurpleSchool

Разница между entrypoint и cmd в Docker

Автор

Олег Марков

Введение

В мире контейнеров Docker часто возникает необходимость в определении точек входа для контейнеров. Для этого Docker предоставляет две основные директивы в своем Dockerfile: ENTRYPOINT и CMD. Мы часто сталкиваемся с вопросами, как именно они работают и в чем различие между ними. В этой статье мы подробно рассмотрим различие между ENTRYPOINT и CMD и как они взаимодействуют при запуске контейнера.

Введение в Dockerfile

Прежде чем перейти к деталям, важно понять, что такое Dockerfile. Это текстовый документ, который содержит инструкции по созданию образов Docker. Dockerfile управляет всеми аспектами создания образа, включая установку программного обеспечения, переменных окружения и запуск приложений. Две из ключевых команд в Dockerfile, влияющие на запуск контейнера, это ENTRYPOINT и CMD.

ENTRYPOINT

Основные функции

Инструкция ENTRYPOINT определяет команду, которую контейнер должен выполнить при запуске. Вы можете думать об ENTRYPOINT как о главной точке входа, которая неизменно будет выполняться перед всеми другими командами. ENTRYPOINT позволяет создать контейнерное приложение, которое работает как запланировано, независимо от того, какие дополнительные параметры передаются при запуске.

Пример использования

Рассмотрим простой Dockerfile, который использует ENTRYPOINT:

FROM ubuntu:latest
ENTRYPOINT ["echo", "Запуск контейнера"]

В данном примере каждый запуск контейнера всегда будет выводить строку "Запуск контейнера". Это возможно благодаря использованию ENTRYPOINT.

Гибкость и настройка

ENTRYPOINT предоставляет возможность добавить больше гибкости к запуску контейнеров. Вы можете передать дополнительные параметры в командной строке при запуске контейнера, чтобы дополнить базовую команду, определенную в ENTRYPOINT.

docker run myimage hello

В результате выполнения команды выше, на экран выводится "Запуск контейнера hello", так как "hello" передается как дополнительный аргумент к ENTRYPOINT.

CMD

Основные функции

Инструкция CMD используется для определения команды по умолчанию, которую нужно выполнить при запуске контейнера. Однако, в отличие от ENTRYPOINT, она может быть легко переопределена во время запуска контейнера. CMD работает как рекомендация по запуску контейнера, которая может быть изменена пользователем на этапе выполнения.

Пример использования

Теперь давайте посмотрим на пример Dockerfile с использованием CMD:

FROM ubuntu:latest
CMD ["echo", "Здравствуйте из CMD"]

Если вы запустите контейнер, то он по умолчанию выполнит команду echo "Здравствуйте из CMD".

docker run myimage

Поведение при переопределении

Особенность CMD в том, что она легко переопределяется. Например, вы можете запустить другой процесс, указав его в командной строке:

docker run myimage echo "Новая команда"

В этом случае контейнер выполнит echo "Новая команда", полностью игнорируя дефолтный CMD.

Совместное использование ENTRYPOINT и CMD

Сочетание инструкций

Одна из самых интересных особенностей Docker — это то, как ENTRYPOINT и CMD могут использоваться вместе. Комбинируя их, ENTRYPOINT определяет базовую команду, а CMD предоставляет аргументы по умолчанию.

Пример комбинирования

Посмотрим на пример, где они используются совместно:

FROM ubuntu:latest
ENTRYPOINT ["echo"]
CMD ["Аргумент по умолчанию"]

Запустив такой контейнер, вы получите вывод:

docker run myimage

Вывод: "Аргумент по умолчанию". Если при запуске контейнера передать другие аргументы, они будут использоваться вместо указанных в CMD:

docker run myimage Новый аргумент

Вывод: "Новый аргумент".

Выбор стратегии

Знать, когда использовать ENTRYPOINT, а когда CMD — это ключевая часть эффективного использования Docker. Используйте ENTRYPOINT, когда у вас есть неизменная команда для контейнера. Если же требуется гибкость, и вы хотите, чтобы по умолчанию выполнялась одна команда, но могли бы легко её заменить, используйте CMD.

Заключение

Теперь, когда вы познакомились с двумя этими важными командами, работа с Docker становится более прозрачной и понятной. Понимая разницу между ENTRYPOINT и CMD, вы можете лучше проектировать и настраивать свои контейнеры. Каждая из них играет свою роль в сложной инфраструктуре, обеспечивая как стабильность, так и гибкость ваших приложений. Теперь вы гораздо лучше вооружены для создания оптимальных инфраструктур в Docker.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile