Для чего нужна команда CMD в Dockerfile?

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

Ответ

Инструкция CMD определяет команду по умолчанию и её аргументы, которые будут выполнены при запуске контейнера из этого образа. Её цель — задать процесс, который должен работать в контейнере как основная служба.

Почему это важно: Без CMD или ENTRYPOINT контейнер сразу завершит работу после старта.

Как я её использую:

  1. Запуск приложения:
    CMD ["python", "app.py"]
  2. Использование с 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> <новая_команда>.