Ответ
Инструкция CMD определяет команду по умолчанию и её аргументы, которые будут выполнены при запуске контейнера из этого образа. Её цель — задать процесс, который должен работать в контейнере как основная служба.
Почему это важно: Без CMD или ENTRYPOINT контейнер сразу завершит работу после старта.
Как я её использую:
- Запуск приложения:
CMD ["python", "app.py"] - Использование с
ENTRYPOINT:CMDчасто задаёт изменяемые аргументы по умолчанию для команды, определённой вENTRYPOINT.# ENTRYPOINT определяет фиксированную команду ENTRYPOINT ["nginx"] # CMD задаёт аргументы по умолчанию, которые можно переопределить CMD ["-g", "daemon off;"]При запуске
docker run my-nginxвыполнитсяnginx -g "daemon off;". Но можно легко переопределить:docker run my-nginx -t(выполнитсяnginx -t).
Форматы записи и лучшие практики:
- Исполняемая форма (exec form, предпочтительна):
CMD ["executable", "arg1", "arg2"]. Она гарантирует, что сигналы (например, SIGTERM) будут отправлены непосредственно процессу приложения. - Shell-форма:
CMD command arg1 arg2. Запускается через/bin/sh -c, что может мешать корректной обработке сигналов.
Важно: В Dockerfile может быть только одна инструкция CMD. Если их несколько, выполнится последняя. Аргументы CMD можно полностью переопределить, указав команду в конце docker run <image> <новая_команда>.