В чем разница между CMD и ENTRYPOINT в Docker

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

Ответ

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

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

На практике это выглядит так:

  1. Только CMD (исполняемая команда по умолчанию):

    CMD ["nginx", "-g", "daemon off;"]

    При docker run <image> запустится nginx. Но команду можно полностью заменить: docker run <image> /bin/bash.

  2. Комбинация ENTRYPOINT + CMD (наиболее частый случай):

    ENTRYPOINT ["curl"]
    CMD ["--help"]
    • docker run <image> выполнит curl --help.
    • docker run <image> -I https://example.com выполнит curl -I https://example.com (аргументы CMD заменяются).
  3. Только ENTRYPOINT (строгая команда):

    ENTRYPOINT ["/app/start.sh"]

    Контейнер всегда будет запускать этот скрипт, а любые аргументы docker run передадутся ему.

Итог: ENTRYPOINT — это «что запускать», а CMD — «с какими аргументами по умолчанию». Команда в контейнере формируется как [ENTRYPOINT] + [CMD (или аргументы из docker run)].