В чем разница между инструкциями RUN, CMD и ENTRYPOINT в Dockerfile?

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

Ответ

Эти инструкции выполняются на разных этапах жизненного цикла Docker-образа и контейнера.

Инструкция Этап выполнения Назначение и поведение
RUN Сборка образа (build time) Выполняет команду в новом слое поверх текущего образа. Используется для установки пакетов, настройки среды, компиляции кода. Результат фиксируется в образе.
CMD Запуск контейнера (runtime) Задает аргументы по умолчанию для запускаемого контейнера. Можно полностью переопределить при запуске командой docker run. В Dockerfile может быть только один CMD.
ENTRYPOINT Запуск контейнера (runtime) Определяет исполняемую команду (и ее параметры), которая всегда будет запущена при старте контейнера. CMD в этом случае служит для передачи аргументов по умолчанию для ENTRYPOINT. Ее сложнее переопределить (только через --entrypoint).

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

  1. Исполняемый образ (лучшая практика): ENTRYPOINT задает программу, CMD — дефолтные аргументы.

    FROM alpine:latest
    RUN apk add --no-cache curl
    ENTRYPOINT ["curl"]
    CMD ["--help"]
    • docker run my-curl выполнит curl --help.
    • docker run my-curl -s https://example.com выполнит curl -s https://example.com (аргументы CMD заменяются).
  2. Образ-утилита с параметрами по умолчанию: Используется для скриптов или кастомных инструментов.

    ENTRYPOINT ["/opt/my-tool.sh"]
    CMD ["--mode", "default"]
  3. Образ для интерактивной оболочки: Только CMD, чтобы можно было легко переопределить команду.

    FROM ubuntu
    RUN apt-get update && apt-get install -y python3
    CMD ["python3"]
    • docker run -it my-python запустит интерактивный Python.
    • docker run -it my-python bash переопределит CMD и откроет bash.

Понимание этих инструкций критично для создания эффективных, безопасных и предсказуемых образов в CI/CD-конвейере.