Ответ
Инструкция CMD в Dockerfile определяет команду по умолчанию и её аргументы, которые выполняются при запуске контейнера из этого образа. Она имеет две основные формы:
-
Exec-формат (рекомендуется): Параметры передаются как массив JSON-строк.
CMD ["executable", "param1", "param2"]Эта форма позволяет контейнеру корректно получать сигналы завершения (например, SIGTERM), так как процесс запускается напрямую, без оболочки.
-
Shell-формат: Команда выполняется в оболочке (
/bin/sh -c).CMD command param1 param2
Ключевые моменты:
- В Dockerfile может быть только одна действующая инструкция
CMD. Если их несколько, выполнится только последняя. - Аргументы
CMDможно переопределить при запуске контейнера, указав новую команду в концеdocker run <image> <new_command>. - Часто
CMDиспользуется в паре сENTRYPOINT. В этом случаеENTRYPOINTопределяет фиксированную исполняемую команду, аCMDзадаёт изменяемые по умолчанию аргументы для неё.
Пример комбинации ENTRYPOINT + CMD:
# Фиксированная команда
ENTRYPOINT ["nginx"]
# Аргументы по умолчанию
CMD ["-g", "daemon off;"]
При таком подходе запуск docker run my-nginx выполнит nginx -g "daemon off;", но можно легко изменить аргументы: docker run my-nginx -g "daemon on;" -c /custom.conf.