Помните, что есть две формы ENTRYPOINT
, CMD
и RUN
. Вы можете «записать» эти команды как пустую строку или как массив JSON. Если вы используете пустую строку, Docker неявно переносит все, что вы там поместили в /bin/sh -c '...'
.
В документации Dockerfile есть таблица, описывающая Понимание того, как CMD и ENTRYPOINT взаимодействуют . Согласно этой таблице, если ENTRYPOINT
- пустая строка, CMD
всегда игнорируется.
(Технически это не на 100% точно, но более точный ответ зависит от понимания загадочных деталей того, как sh -c
на самом деле работает.)
Это будет делать то, что вы хотите, если вместо этого вы используете форму массива JSON, чтобы избежать неявной sh -c
оболочки
ENTRYPOINT ["/bin/echo", "1"]
CMD ["2"]
Шаблон, который я обычно нахожуполезно зарезервировать ENTRYPOINT
для сценария-обертки, который выполняет первоначальную настройку, а затем exec "$@"
для запуска CMD
. Типичная команда docker run
имеет так много аргументов, что возможность опустить командное слово для интерактивного инструмента, упакованного в Docker, не очень полезна. Если вы предпочитаете эксклюзив CMD
, тогда намного проще запустить отладочную оболочку, возможно, с вашей первоначальной настройкой, если вы используете ENTRYPOINT
оболочку.
CMD ["/bin/echo", "1", "2"]