Что указывает инструкция CMD в Dockerfile?

«Что указывает инструкция CMD в Dockerfile?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инструкция CMD в Dockerfile определяет команду по умолчанию и её аргументы, которые выполняются при запуске контейнера из этого образа. Она имеет две основные формы:

  1. Exec-формат (рекомендуется): Параметры передаются как массив JSON-строк.

    CMD ["executable", "param1", "param2"]

    Эта форма позволяет контейнеру корректно получать сигналы завершения (например, SIGTERM), так как процесс запускается напрямую, без оболочки.

  2. 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.