Ответ
ENTRYPOINT и CMD определяют команду, которая выполняется при запуске контейнера. Их можно использовать вместе для создания гибкого интерфейса.
ENTRYPOINTзадает исполняемую команду, которая всегда будет запущена. Её сложно переопределить. Аргументы, переданные вdocker run, добавляются в конец командыENTRYPOINT.CMDзадает аргументы по умолчанию дляENTRYPOINT. ЕслиENTRYPOINTне указан,CMDопределяет команду для выполнения. АргументыCMDлегко переопределяются аргументами изdocker run.
Практические сценарии:
-
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переопределены).
-
Только
CMD(для одноразовых команд):CMD ["nginx", "-g", "daemon off;"]docker run my-nginxзапустит nginx.docker run my-nginx shполностью переопределитCMDи запустит оболочку.
-
Только
ENTRYPOINT(для создания контейнера как бинарника):ENTRYPOINT ["python", "app.py"]docker run my-appвыполнитpython app.py.docker run my-app --debugвыполнитpython app.py --debug.
Рекомендация: Используйте ENTRYPOINT для фиксированной части команды (например, интерпретатор или основной бинарник), а CMD для предоставления изменяемых по умолчанию аргументов. Это делает контейнер похожим на исполняемую программу.