Ответ
Да, Dockerfile может не содержать инструкции ENTRYPOINT. В этом случае поведение контейнера определяется инструкцией CMD.
Практические сценарии для DevOps:
-
Только CMD: Контейнер запускает команду из
CMD, которую можно переопределить приdocker run.FROM alpine:3.18 CMD ["nginx", "-g", "daemon off;"]Запуск:
docker run my-nginx(запустит nginx) илиdocker run my-nginx sh(переопределит CMD и запустит shell). -
Ни ENTRYPOINT, ни CMD: Такой образ будет корректен, но контейнер немедленно завершится, так как ему нечего выполнять. Это может быть полезно для базовых образов (например,
scratch), предназначенных для сборки других образов. -
Комбинация ENTRYPOINT и CMD:
ENTRYPOINTзадает исполняемую программу, аCMD— аргументы по умолчанию. Это наиболее предсказуемый шаблон для production.FROM alpine:3.18 ENTRYPOINT ["curl"] CMD ["--help"]Запуск
docker run my-curlвыполнитcurl --help, аdocker run my-curl -s https://example.comвыполнитcurl -s https://example.com.
Рекомендация: Для служебных или отладочных контейнеров можно обойтись только CMD. Для production-сервисов явно указывайте ENTRYPOINT для четкого определения исполняемого процесса.