Ответ
CMD и ENTRYPOINT определяют команду, которая выполняется при запуске контейнера, но их взаимодействие и переопределяемость различаются.
ENTRYPOINTзадает фиксированную исполняемую команду. Ее сложнее переопределить извне. Аргументы, указанные вCMDили при запускеdocker run, передаются как аргументы этой команде.CMDпредоставляет аргументы по умолчанию дляENTRYPOINTили определяет исполняемую команду, которую можно полностью переопределить при запуске контейнера.
На практике это выглядит так:
-
Только CMD (исполняемая команда по умолчанию):
CMD ["nginx", "-g", "daemon off;"]При
docker run <image>запустится nginx. Но команду можно полностью заменить:docker run <image> /bin/bash. -
Комбинация ENTRYPOINT + CMD (наиболее частый случай):
ENTRYPOINT ["curl"] CMD ["--help"]docker run <image>выполнитcurl --help.docker run <image> -I https://example.comвыполнитcurl -I https://example.com(аргументыCMDзаменяются).
-
Только ENTRYPOINT (строгая команда):
ENTRYPOINT ["/app/start.sh"]Контейнер всегда будет запускать этот скрипт, а любые аргументы
docker runпередадутся ему.
Итог: ENTRYPOINT — это «что запускать», а CMD — «с какими аргументами по умолчанию». Команда в контейнере формируется как [ENTRYPOINT] + [CMD (или аргументы из docker run)].
Видео-ответы
▶
▶
▶
▶
▶