Ответ
Эти инструкции выполняются на разных этапах жизненного цикла Docker-образа и контейнера.
| Инструкция | Этап выполнения | Назначение и поведение |
|---|---|---|
RUN |
Сборка образа (build time) | Выполняет команду в новом слое поверх текущего образа. Используется для установки пакетов, настройки среды, компиляции кода. Результат фиксируется в образе. |
CMD |
Запуск контейнера (runtime) | Задает аргументы по умолчанию для запускаемого контейнера. Можно полностью переопределить при запуске командой docker run. В Dockerfile может быть только один CMD. |
ENTRYPOINT |
Запуск контейнера (runtime) | Определяет исполняемую команду (и ее параметры), которая всегда будет запущена при старте контейнера. CMD в этом случае служит для передачи аргументов по умолчанию для ENTRYPOINT. Ее сложнее переопределить (только через --entrypoint). |
Практические паттерны для DevOps:
-
Исполняемый образ (лучшая практика):
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заменяются).
-
Образ-утилита с параметрами по умолчанию: Используется для скриптов или кастомных инструментов.
ENTRYPOINT ["/opt/my-tool.sh"] CMD ["--mode", "default"] -
Образ для интерактивной оболочки: Только
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-конвейере.