В чем разница между инструкциями CMD и ENTRYPOINT в Dockerfile?

«В чем разница между инструкциями CMD и ENTRYPOINT в Dockerfile?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ENTRYPOINT и CMD определяют команду, которая выполняется при запуске контейнера. Их можно использовать вместе для создания гибкого интерфейса.

  • ENTRYPOINT задает исполняемую команду, которая всегда будет запущена. Её сложно переопределить. Аргументы, переданные в docker run, добавляются в конец команды ENTRYPOINT.
  • CMD задает аргументы по умолчанию для ENTRYPOINT. Если ENTRYPOINT не указан, CMD определяет команду для выполнения. Аргументы CMD легко переопределяются аргументами из docker run.

Практические сценарии:

  1. ENTRYPOINT как исполняемый файл, CMD как аргументы по умолчанию (наиболее полезный вариант):

    ENTRYPOINT ["curl"]
    CMD ["--help"]
    • docker run my-curl выполнит curl --help.
    • docker run my-curl -s https://example.com выполнит curl -s https://example.com (аргументы CMD переопределены).
  2. Только CMD (для одноразовых команд):

    CMD ["nginx", "-g", "daemon off;"]
    • docker run my-nginx запустит nginx.
    • docker run my-nginx sh полностью переопределит CMD и запустит оболочку.
  3. Только ENTRYPOINT (для создания контейнера как бинарника):

    ENTRYPOINT ["python", "app.py"]
    • docker run my-app выполнит python app.py.
    • docker run my-app --debug выполнит python app.py --debug.

Рекомендация: Используйте ENTRYPOINT для фиксированной части команды (например, интерпретатор или основной бинарник), а CMD для предоставления изменяемых по умолчанию аргументов. Это делает контейнер похожим на исполняемую программу.