n1ro°
RU

Текст и данные · Инструкция

Dockerfile CMD и ENTRYPOINT: как работают вместе

CMD и ENTRYPOINT вместе определяют, что именно запускается при старте контейнера и какие аргументы можно переопределить. Типичная схема — стабильный executable в ENTRYPOINT и defaults в CMD.

Редакция N1RO · Проверено

Короткий ответ

ENTRYPOINT задаёт основной executable контейнера, а CMD часто используют как его аргументы по умолчанию. Аргументы после image в `docker run` могут заменить CMD, не меняя ENTRYPOINT.

Что важно знать про Dockerfile CMD

Путаница возникает, когда обе инструкции выглядят как команды. Удобная модель: ENTRYPOINT фиксирует программу, CMD задаёт стандартные параметры либо стандартную команду, если ENTRYPOINT отсутствует. Docker рекомендует exec form для ENTRYPOINT, когда нужен предсказуемый запуск executable. Shell form вводит оболочку и иначе обрабатывает аргументы и сигналы.

Совет: Для сервисного image используйте exec form, если не нужна shell-обработка строки.

Как собрать CMD и ENTRYPOINT

  1. Решите, меняется ли программа или только параметры.
  2. Задайте фиксированный executable через ENTRYPOINT exec form.
  3. Положите default arguments в CMD.
  4. Запустите image без аргументов.
  5. Повторите с аргументами после image.
  6. Проверьте обработку docker stop.

Предупреждение: Не добавляйте параметры после image, ожидая заменить ENTRYPOINT: обычно они заменяют CMD/добавляются к exec ENTRYPOINT.

Нюансы: docker run arguments и PID 1

Для сервиса важно понимать PID 1: корректное получение SIGTERM влияет на graceful shutdown при `docker stop`. Неправильная оболочка между Docker и приложением может усложнить завершение. Комбинацию следует тестировать двумя запусками: без дополнительных аргументов и с override после имени image. Так видно, какая часть действительно заменяется пользователем.

Важно: Проверьте `docker stop` на тестовом контейнере — корректные сигналы важнее красивого старта.

Пример: executable с default arguments

`ENTRYPOINT ["python","app.py"]` и `CMD ["--port","8000"]`; `docker run image --port 9000` меняет параметры, сохраняя executable.

Предсказуемая схема CMD + ENTRYPOINT

Если image должен всегда запускать один executable, задайте его через exec-form ENTRYPOINT, а меняемые defaults — через CMD. Тогда `docker run image --flag` заменяет CMD-аргументы и передаёт их executable. Это удобно для CLI-образов и сервисов с понятной точкой входа.

Почему shell form может мешать остановке

Shell-form ENTRYPOINT запускается через `/bin/sh -c`; основной executable может перестать быть PID 1 и не получить сигнал так, как ожидается. Для long-running process Docker рекомендует exec form либо явный `exec` в shell-wrapper. Проверьте остановку контейнера командой `docker stop`, а не только успешный старт.

CMD vs ENTRYPOINT

  • ENTRYPOINT содержит стабильный executable, если image используется как исполняемый сервис/CLI.
  • CMD содержит только те defaults, которые пользователь должен иметь возможность заменить.
  • Exec form применена там, где важна корректная передача Unix-сигналов.
  • `docker stop` проверен на тестовом контейнере, а не только успешный `docker run`.

Что учитывать

Путаница возникает, когда обе инструкции выглядят как команды. Удобная модель: ENTRYPOINT фиксирует программу, CMD задаёт стандартные параметры либо стандартную команду, если ENTRYPOINT отсутствует. Docker рекомендует exec form для ENTRYPOINT, когда нужен предсказуемый запуск executable. Shell form вводит оболочку и иначе обрабатывает аргументы и сигналы.

Источники и проверка

Фактическая часть сверена по первичным источникам (в т.ч. Dockerfile reference). Пример и формулировки — редакция N1RO на 2026-09-22.