Вопрос проверяет понимание разницы между инструкциями CMD и ENTRYPOINT в Dockerfile, что важно для правильной настройки контейнеров.
В Dockerfile инструкции CMD и ENTRYPOINT определяют, что будет выполняться при запуске контейнера. Однако их поведение различается: CMD задает команду по умолчанию, которую можно легко переопределить, а ENTRYPOINT фиксирует исполняемый файл, который всегда запускается.
CMD используется для указания команды и аргументов, которые будут выполнены, если не задана другая команда при запуске. Например:
FROM ubuntu
CMD ["echo", "Hello World"]При запуске docker run image выведется "Hello World", но docker run image ls выполнит ls вместо echo.
ENTRYPOINT определяет основную программу, которая всегда выполняется. Аргументы, переданные при запуске, добавляются к ней. Пример:
FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello World"]Теперь docker run image выведет "Hello World", а docker run image Hi — "Hi". CMD здесь служит аргументами по умолчанию.
Часто ENTRYPOINT задает утилиту, а CMD — её параметры. Это удобно для создания образов-обёрток. Например, для базы данных:
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]При запуске контейнера выполняется скрипт, который инициализирует БД и запускает PostgreSQL.
Используйте ENTRYPOINT, когда нужно зафиксировать исполняемый файл, а CMD — для задания аргументов по умолчанию. Это делает образы более гибкими и предсказуемыми, особенно при создании контейнеров для микросервисов.