Ответ
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"]
Сценарии использования:
- Исполняемый контейнер:
ENTRYPOINT ["curl"]. Тогдаdocker run my-curl -I https://google.comвыполнитcurl -I https://google.com. - Запуск с фиксированными опциями: Гарантирует, что определенные флаги (например,
--config) всегда будут переданы приложению. - Инициализация: Как в примере выше, для подготовки среды (ожидание БД, применение миграций).
Важно: ENTRYPOINT можно переопределить флагом --entrypoint в docker run, но на практике это делается редко.