В каком порядке выполняются инструкции CMD и ENTRYPOINT в Dockerfile, если указаны обе?

«В каком порядке выполняются инструкции CMD и ENTRYPOINT в Dockerfile, если указаны обе?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При совместном использовании ENTRYPOINT и CMD в Dockerfile они объединяются для формирования полной команды запуска контейнера.

Правило: Аргументы из CMD передаются как параметры команде, указанной в ENTRYPOINT.

Пример Dockerfile:

ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

Результат запуска контейнера без своих аргументов:

Hello World

Если передать свои аргументы при запуске (docker run <image> <args>):

docker run my-image Universe
# Результат: Hello Universe

В этом случае CMD ["World"] будет полностью заменён переданными аргументами (Universe).

Важные детали:

  • Формат имеет значение. Если ENTRYPOINT указан в shell-формате (например, ENTRYPOINT echo Hello), то CMD будет проигнорирован, а команда запустится в отдельном shell-процессе.
  • Используйте exec-формат (с квадратными скобками) для ENTRYPOINT, чтобы CMD работал как задумано, и контейнер получал сигналы напрямую.