Ответ
При совместном использовании ENTRYPOINT и CMD в Dockerfile они объединяются для формирования полной команды запуска контейнера.
Правило: Аргументы из CMD передаются как параметры команде, указанной в ENTRYPOINT.
Пример Dockerfile:
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
Результат запуска контейнера без своих аргументов:
Hello World
Если передать свои аргументы при запуске (docker run <image> <args>):
docker run my-image Universe
# Результат: Hello Universe
В этом случае CMD ["World"] будет полностью заменён переданными аргументами (Universe).
Важные детали:
- Формат имеет значение. Если
ENTRYPOINTуказан в shell-формате (например,ENTRYPOINT echo Hello), тоCMDбудет проигнорирован, а команда запустится в отдельном shell-процессе. - Используйте exec-формат (с квадратными скобками) для
ENTRYPOINT, чтобыCMDработал как задумано, и контейнер получал сигналы напрямую.