Что такое ENTRYPOINT в Dockerfile?

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

Ответ

ENTRYPOINT — это инструкция Dockerfile, которая определяет исполняемую команду, всегда запускаемую при старте контейнера. Её основное назначение — сделать контейнер «исполняемым», как будто это бинарный файл.

Из моего опыта, ключевые отличия от CMD:

  • ENTRYPOINT задает фиксированную базовую команду.
  • Аргументы, переданные в docker run <image> <args>, добавляются в конец команды ENTRYPOINT.
  • CMD же задает аргументы по умолчанию для ENTRYPOINT или саму команду, если ENTRYPOINT не указан.

Практическое применение: Я использую ENTRYPOINT для wrapper-скриптов, которые выполняют предварительную настройку перед запуском основного приложения. Например, для подстановки переменных окружения в конфиги.

# Пример из практики: контейнер с приложением на Python
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src/ .
COPY docker-entrypoint.sh .
RUN chmod +x docker-entrypoint.sh

# Основная логика инициализации вынесена в скрипт
ENTRYPOINT ["./docker-entrypoint.sh"]
# CMD задает аргументы по умолчанию для скрипта
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]

Сценарии использования:

  1. Исполняемый контейнер: ENTRYPOINT ["curl"]. Тогда docker run my-curl -I https://google.com выполнит curl -I https://google.com.
  2. Запуск с фиксированными опциями: Гарантирует, что определенные флаги (например, --config) всегда будут переданы приложению.
  3. Инициализация: Как в примере выше, для подготовки среды (ожидание БД, применение миграций).

Важно: ENTRYPOINT можно переопределить флагом --entrypoint в docker run, но на практике это делается редко.