Текст и данные · Инструкция
Dockerfile CMD и ENTRYPOINT: как работают вместе
CMD и ENTRYPOINT вместе определяют, что именно запускается при старте контейнера и какие аргументы можно переопределить. Типичная схема — стабильный executable в ENTRYPOINT и defaults в CMD.
Короткий ответ
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
- Решите, меняется ли программа или только параметры.
- Задайте фиксированный executable через ENTRYPOINT exec form.
- Положите default arguments в CMD.
- Запустите image без аргументов.
- Повторите с аргументами после image.
- Проверьте обработку 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.