Compose command не заменил программу: как работает entrypoint

Образ обычно запускает экспортёр. В Compose вы пишете command: python -V, чтобы проверить версию, но вместо версии экспортёр жалуется на неизвестный аргумент python. Причина часто в ENTRYPOINT образа: command заменил аргументы по умолчанию, сохранив основную программу.

В exec-форме ENTRYPOINT задаёт начало команды, а CMD — добавляемые к нему значения по умолчанию. Compose command меняет CMD. Если ENTRYPOINT уже содержит python /app/export.py, новая строка окажется аргументами экспортёра. Чтобы выбрать другую программу, потребуется заменить и entrypoint.

Посмотрим на конфигурацию явно

У показанного публичного Python-образа зададим собственный entrypoint и список command. Это маленький сервис для печати разобранных аргументов: сети, тома и секреты ему не нужны. Код Python находится прямо в argv после -c.

services:
  inspect:
    image: python:3.12-slim
    entrypoint: ["python", "-c", "import sys; print(sys.argv[1:])"]
    command: ["report", "--date", "2026-11-03"]

Сохраните файл как compose.yaml. docker compose config покажет нормализованную конфигурацию. При запуске docker compose run --rm inspect ожидается список ['report', '--date', '2026-11-03']. Новый command: ["--help"] передаст только --help той же программе Python; entrypoint останется прежним.

Для диагностического запуска версии замените entrypoint на ["python"] и command на ["-V"]. Пустой entrypoint: [] явно убирает entrypoint образа, тогда command должен содержать полную программу. Значение null означает использование исходного значения образа, поэтому [] и null здесь имеют разный смысл.

Список точнее строки

Список сохраняет границы аргументов. Строка command в Compose не гарантирует автоматического запуска через shell из SHELL образа. Если действительно нужны pipe, переменные оболочки или несколько команд, укажите оболочку явно и проверьте экранирование. Для обычной программы прямой список проще читать и проверять.

Это также объясняет, почему кавычки, скопированные из терминала внутрь одного элемента списка, могут стать частью аргумента. Терминал и YAML выполняют разные этапы разбора. Значение с пробелом следует оформить одним строковым элементом, без дополнительных shell-кавычек внутри него.

Сначала конфигурация, затем фактический процесс

Начните с docker image inspect: поля Config.Entrypoint и Config.Cmd показывают умолчания образа. Потом проверьте docker compose config с теми же override-файлами, которые используются при запуске. Наконец, docker inspect контейнера показывает итоговые Path и Args. Это три разных слоя, и каждый отвечает на свой вопрос.

У работающего приложения отдельно убедитесь, что основная программа получает сигналы остановки. Умение собрать верный argv не заменяет проверку жизненного цикла, но помогает не добавлять оболочку случайно. Для задачи печати аргументов достаточно минимального запуска, для сервиса нужен ещё штатный запуск приложения.

В программе Docker и Docker Compose есть команды запуска, основной процесс, диагностика контейнеров и конфигурация нескольких сервисов. Откройте курс, чтобы уверенно менять поведение образа и понимать итоговый запуск приложения.

Продолжить на практике

  • Docker и Docker Compose: контейнеризация приложений ↗

    Упакуйте приложение в Docker и запустите его с PostgreSQL через Compose. Образы, сети, тома, диагностика поломок, обновление версий и восстановление данных — с практикой и итоговым проектом.