Ответ
В Dockerfile инструкции CMD и ENTRYPOINT обе определяют команду, которая будет выполняться при запуске контейнера, но их назначение и поведение при переопределении существенно различаются.
CMD (Command)
Назначение:
- Предоставляет команду по умолчанию для исполняемого файла контейнера.
- Может предоставлять аргументы по умолчанию для
ENTRYPOINT. - Если в Dockerfile указано несколько
CMD, используется только последняя.
Поведение при запуске:
- Легко переопределяется при запуске контейнера, передав новую команду в
docker run <image> <новая_команда>. Это позволяет пользователю запускать произвольные команды внутри контейнера. - Если
ENTRYPOINTне указан,CMDопределяет основную команду, которая будет выполнена.
Пример:
FROM alpine
CMD ["echo", "Hello from CMD"]
- Запуск:
docker run <image>выведетHello from CMD. - Переопределение:
docker run <image> echo "Overridden CMD"выведетOverridden CMD.
Почему используется: Для задания команды по умолчанию, которая может быть легко изменена пользователем контейнера, например, для запуска интерактивной оболочки или выполнения скрипта.
ENTRYPOINT (Entrypoint)
Назначение:
- Определяет основную команду или исполняемый файл, который всегда будет запускаться при старте контейнера.
- Превращает образ в исполняемый файл, делая его похожим на обычную программу.
- Аргументы, переданные в
docker run, или команда изCMD(если она есть), добавляются как аргументы кENTRYPOINT.
Поведение при запуске:
- Не переопределяется напрямую аргументами
docker run. Аргументыdocker runстановятся параметрами дляENTRYPOINT. - Для переопределения
ENTRYPOINTнеобходимо явно использовать флаг--entrypointвdocker run.
Пример:
FROM alpine
ENTRYPOINT ["echo"]
CMD ["Hello from ENTRYPOINT"]
- Запуск:
docker run <image>выведетHello from ENTRYPOINT(CMD используется как аргумент для ENTRYPOINT). - Передача аргументов:
docker run <image> "New argument"выведетNew argument(CMD заменяется на "New argument"). - Переопределение ENTRYPOINT:
docker run --entrypoint "/bin/sh" <image>запустит/bin/shвнутри контейнера.
Почему используется: Для создания контейнера, который ведет себя как исполняемая программа (например, утилита командной строки или сервис), где ENTRYPOINT является этой программой, а CMD — ее аргументами по умолчанию.
Ключевое отличие:
CMDпредоставляет аргументы по умолчанию дляENTRYPOINTили команду по умолчанию, которую легко переопределить.ENTRYPOINTопределяет основной исполняемый файл контейнера, который не меняется, а принимаетCMDили аргументыdocker runкак свои параметры.