Это старая версия документа!
Dockerfile
- RUN. RUN, в основном используемый для создания образов и установки приложений и пакетов, создает новый слой поверх существующего образа, фиксируя результаты.
- CMD. Устанавливает параметры по умолчанию, которые можно переопределить из интерфейса командной строки Docker (CLI) при запуске контейнера.
- ENTRYPOINT. Параметры по умолчанию, которые нельзя переопределить, когда контейнеры Docker запускаются с параметрами CLI.
- Если во время выполнения определена только одна из инструкций, то и CMD и ENTRYPOINT будут иметь одинаковый эффект.
- Те же результаты будут, если использовать CMD вместо ENTRYPOINT.
Правила использования
- Если используется режим shell для ENTRYPOINT, CMD игнорируется.
- При использовании режима exec для ENTRYPOINT аргументы CMD добавляются в конце.
- При использовании режима exec для инструкции ENTRYPOINT необходимо использовать режим exec и для инструкции CMD. Если этого не сделать, Docker попытается добавить sh -c в уже добавленные аргументы, что может привести к некоторым непредсказуемым результатам.
- Инструкции ENTRYPOINT и CMD могут быть переопределены с помощью флагов командной строки.
- Все вышеперечисленные факты справедливы, но разработчики имеют возможность переопределять флаги в команде docker run
Использование
- Используйте ENTRYPOINT, если вы не хотите, чтобы разработчики изменяли исполняемый файл, который запускается при запуске контейнера. Вы можете представлять, что ваш контейнер – исполняемая оболочка.
- Используйте только CMD (без определения ENTRYPOINT), если требуется, чтобы разработчики могли легко переопределять исполняемый файл. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг –entrypoint.
command
В файле Compose переопределяет CMDDockerfile. Есть некоторые незначительные синтаксические различия (в частности, Compose никогда не будет автоматически вставлять sh -cза вас оболочку оболочки), но они контролируют одно и то же в метаданных контейнера.
Однако помните, что помимо Compose существуют и другие способы запуска контейнера. docker run не прочитает ваш docker-compose.yml файл и не увидит эту command: он также не читается такими инструментами, как Kubernetes. Если вы встроите Dockerfile CMD в, оно будет использовать во всех вариантах.
Переопределение действительно необходимо command:в том случае, если вам нужно запустить основной процесс, отличный от стандартного, для контейнера.