PassFront
  1. PassFront
  2. База знаний
  3. Dockerfile и образы

В чём разница между CMD и ENTRYPOINT в Dockerfile?

Dockerfile и образы

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

Модель поведения

  • Только CMD ["--port", "8080"]: команда по умолчанию, docker run img bash заменит её.
  • Только ENTRYPOINT ["nginx"]: контейнер всегда стартует nginx, аргументы docker run img -t уйдут ему параметрами.
  • Вместе: ENTRYPOINT ["python", "manage.py"] плюс CMD ["runserver"] — дефолт, который легко переопределить.
  • RUN, в отличие от обеих, выполняется при сборке образа и создаёт слой.

Shell-форма против exec-формы

  • Exec-форма ["executable", "arg"]: процесс становится PID 1 и корректно получает SIGTERM при docker stop.
  • Shell-форма CMD npm start: запуск через /bin/sh -c, сигналы теряются, остановка растягивается на таймаут.

Коротко для собеседования

ENTRYPOINT фиксирует, какую программу запускает контейнер, а CMD даёт ей аргументы по умолчанию, которые легко перебить в docker run. Писать обе стоит в exec-форме: иначе PID 1 становится shell, SIGTERM не доходит до приложения и остановка ждёт таймаута.

Другие вопросы раздела