В чём разница между 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 не доходит до приложения и остановка ждёт таймаута.