← Назад к вопросам

В чем разница между CMD и ENTRYPOINT в Docker?

1.0 Junior🔥 121 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Разница между CMD и ENTRYPOINT в Docker

CMD и ENTRYPOINT — два важных инструмента в Docker для определения поведения контейнера, но они служат разным целям и по-разному взаимодействуют с аргументами командной строки.

ENTRYPOINT — главная команда контейнера

ENTRYPOINT определяет основной процесс, который будет запущен в контейнере. Это точка входа, которая практически не переопределяется при запуске контейнера.

ENTYPOINT ["python", "app.py"]

В формате JSON (exec-форма) — рекомендуемый способ:

ENTYPOINT ["python", "-u", "app.py"]

В формате строки (shell-форма):

ENTYPOINT python app.py

CMD — аргументы по умолчанию

CMD предоставляет аргументы по умолчанию для ENTRYPOINT или определяет команду, которая будет запущена, если ENTRYPOINT не указан. CMD легко переопределяется при запуске контейнера.

CMD ["--help"]
CMD python app.py

Как они взаимодействуют

Сценарий 1: только CMD

FROM python:3.11
CMD ["python", "app.py"]
docker run myimage                    # запустит: python app.py
docker run myimage python other.py   # запустит: python other.py (CMD перезаписывается)

Сценарий 2: только ENTRYPOINT

FROM python:3.11
ENTYPOINT ["python", "app.py"]
docker run myimage                    # запустит: python app.py
docker run myimage --debug           # запустит: python app.py --debug (аргумент добавляется)

Сценарий 3: ENTRYPOINT + CMD (оптимальный подход)

FROM python:3.11
ENTYPOINT ["python"]
CMD ["app.py"]
docker run myimage                    # запустит: python app.py
docker run myimage other.py          # запустит: python other.py
docker run myimage -u app.py         # запустит: python -u app.py

Это даёт максимальную гибкость!

Практический пример: FastAPI приложение

FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

ENTYPOINT ["python", "-u"]
CMD ["main.py"]
# Нормальный запуск
docker run myapp
# Эквивалентно: python -u main.py

# С Uvicorn параметрами
docker run myapp -m uvicorn main:app --host 0.0.0.0 --port 8000
# Эквивалентно: python -u -m uvicorn main:app --host 0.0.0.0 --port 8000

# С отладкой
docker run myapp -m pdb main.py
# Эквивалентно: python -u -m pdb main.py

Ключевые различия

ПараметрCMDENTRYPOINT
НазначениеАргументы по умолчаниюГлавная команда контейнера
ПереопределениеЛегко (командная строка заменяет)Сложнее (нужен флаг --entrypoint)
ИспользованиеГибкие параметрыФиксированная команда
ВзаимодействиеИгнорируется, если указан ENTRYPOINTОбъединяется с CMD

Shell-форма vs Exec-форма

Shell-форма (запускает через /bin/sh -c):

CMD python app.py
ENTYPOINT python app.py

Exec-форма (прямой вызов, рекомендуется):

CMD ["python", "app.py"]
ENTYPOINT ["python", "app.py"]

Exec-форма предпочтительнее, потому что:

  • Не создаёт процесс shell
  • Корректно обрабатывает сигналы (SIGTERM для graceful shutdown)
  • Производительнее

Рекомендации для production

  1. Всегда используй exec-форму для ENTRYPOINT и CMD
  2. Разделяй на ENTRYPOINT + CMD для максимальной гибкости
  3. Используй флаг -u для Python контейнеров (unbuffered output)
  4. ENTRYPOINT для wrapper скриптов, если нужна логика инициализации
  5. Протестируй переопределение аргументов в production-like окружении

Такой подход обеспечивает гибкость, безопасность и правильное управление жизненным циклом контейнера.