Когда дело доходит до запуска контейнеров в Docker, CMD и ENTRYPOINT используются для определения команды, которая будет выполняться при запуске контейнера. Однако у них разное поведение и цели.
- CMD:
Инструкция CMD используется для предоставления аргументов по умолчанию для команды точки входа контейнера. Его можно переопределить при запуске контейнера. Инструкция CMD может быть указана в трех различных формах:
- Форма оболочки: команда CMD (например, CMD echo «Hello, World!»)
- Форма Exec: CMD [“исполняемый файл”,”param1″,”param2″] (например, CMD [“echo”,”Hello, World!”])
- Форма JSON: CMD [“param1”, “param2”] (как запись в массиве JSON)
В формах оболочки и exec CMD указывает команду и ее аргументы. Если инструкция CMD присутствует в файле Dockerfile несколько раз, действует только последняя.
Пример:
Dockerfile:
FROM alpine
CMD echo "Hello, World!"
В этом примере при запуске контейнера он выполнит команду echo «Hello, World!»по умолчанию.
- ENTRYPOINT:
Инструкция ENTRYPOINT используется для настройки контейнера, который будет работать как исполняемый файл. Он предоставляет основную команду, которая будет выполнена при запуске контейнера. ENTRYPOINT позволяет определить контейнер как исполняемый файл, а дополнительные параметры, указанные в командной строке, будут переданы в качестве аргументов команде ENTRYPOINT.
Инструкцию ENTRYPOINT также можно указать в тех же трех формах, что и CMD.
Пример:
Dockerfile:
FROM alpine
ENTRYPOINT ["echo"]
В этом примере при запуске контейнера он выполнит команду echo. Любые дополнительные параметры, передаваемые при запуске контейнера, будут рассматриваться как аргументы команды echo.
Вот пример совместного использования CMD и ENTRYPOINT:
Dockerfile:
FROM alpine
ENTRYPOINT ["echo", "Hello,"]
CMD ["World!"]
В этом примере ENTRYPOINT определяет основную команду как echo, а CMD указывает аргумент по умолчанию как World!. Когда контейнер запускается без каких-либо дополнительных параметров, он выводит Hello, World!.