Может ли существовать Dockerfile без инструкции ENTRYPOINT?

«Может ли существовать Dockerfile без инструкции ENTRYPOINT?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, Dockerfile может не содержать инструкции ENTRYPOINT. В этом случае поведение контейнера определяется инструкцией CMD.

Практические сценарии для DevOps:

  1. Только 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).

  2. Ни ENTRYPOINT, ни CMD: Такой образ будет корректен, но контейнер немедленно завершится, так как ему нечего выполнять. Это может быть полезно для базовых образов (например, scratch), предназначенных для сборки других образов.

  3. Комбинация 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 для четкого определения исполняемого процесса.