Dockerfile Entrypoint, кажется, добавляет вместо перезаписи - PullRequest
0 голосов
/ 21 октября 2019

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

FROM ubuntu:18.04
ENTRYPOINT echo 1
CMD 2

После построения этого образа с помощью docker build -t test . я запускаю контейнер с docker run test 3.

Как я полагаю, выполняется команда finally, которая выполняется:echo 1 2 3, и результат должен быть 1 2 3.

Однако результат равен '1'.

Я запрашиваю фактическую команду, используя docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q), и получаю следующий результат. /adoring_chaum /bin/sh [-c echo 1 2]

Кажется, что фактическая команда - это старая точка входа с новой точкой входа в качестве параметра. И CMD в параметре dockerfile и времени выполнения игнорируется.

Я не могу найти никаких объяснений в докере.

Может ли кто-нибудь дать мне объяснение?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Помните, что есть две формы 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"]
1 голос
/ 21 октября 2019

Чтобы перезаписать ENTRYPOINT, вы должны использовать опцию --entrypoint. Какие бы аргументы не передавались после имени изображения, они будут аргументами (перезаписывают CMD) для существующей команды, указанной как ENTRYPOINT в Dockerfile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...