Понимание CMD и ENTRYPOINT в Docker: различия и примеры использования

Когда дело доходит до запуска контейнеров в Docker, CMD и ENTRYPOINT используются для определения команды, которая будет выполняться при запуске контейнера. Однако у них разное поведение и цели.

  1. 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!»по умолчанию.

  1. 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!.