Вопрос: Как я могу переопределить CMD при запуске изображения докеров?


Я хочу проверить изображение докеров, созданное кем-то другим, с указанием как точки входа, так и cmd, например:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

В настоящее время я занимаюсь:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Есть ли способ переопределить CMD как пустой (так что мне не нужно использовать «--login»)?


74
2018-05-10 12:59


Источник




Ответы:


Вы можете просто войти через docker run -it --entrypoint=/bin/bash $IMAGE -i (вы запустите новый контейнер из изображения и получите оболочку bash в интерактивном режиме), а затем запустите команду entrypoint в этом контейнере.

Затем вы можете проверить запущенный контейнер в состоянии, в котором оно должно работать.

EDIT: с Docker 1.3 вы можете использовать exec для запуска процесса в запущенном контейнере. Начните свой контейнер, как обычно, а затем введите его, выпустив:

docker exec -it $CONTAINER_ID /bin/bash

Предполагая, что bash установлен, вам будет предоставлен доступ к рабочему контейнеру.


82
2018-05-12 09:28



Разве это не выполнит «/ usr / sbin / apache2ctl / bin / bash»? (потому что ваш пример не переопределяет точку входа, он будет использовать точку входа, определенную в файле Docker, или я что-то не хватает?) - warp
Возможно, это что-то другое для более старых / более новых версий докеров? Это, безусловно, запускает точку входа для меня: gist.github.com/warpr/26a5cc471dce7fcf9021 , Это использует докер 0.10.0 на Ubuntu 13.10. - warp
Переходя -entrypoint переопределяет точку входа. См. Отредактированный ответ - Panagiotis Moustafellos
Я знаю, что передача --entrypoint переопределяет точку входа. Но когда я использую --entrypoint, как переопределить CMD, чтобы быть пустым? (Для bash я могу использовать что-то вроде -i или --login, но не все точки входа, которые я могу использовать, будут иметь эквивалентный аргумент «фиктивный»). - warp
По крайней мере, в Docker v1.11.1 кажется, что переопределение -entrypoint также предотвращает нормальное добавление CMD к точке входа. Это происходит только тогда, когда точка входа не переопределяется. - Jasmine Hegman


Видеть: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Соответствующая часть:

CMD (команда по умолчанию или параметры) Вспомните опцию COMMAND в командной строке Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Эта команда является необязательной, потому что человек, создавший IMAGE, уже мог предоставить команду COMMAND по умолчанию, используя CMD Dockerfile. Как оператор (человек, запускающий контейнер из изображения), вы можете переопределить этот CMD, просто указав новую команду COMMAND.

Если изображение также указывает ENTRYPOINT, тогда CMD или COMMAND будут добавлены в качестве аргументов ENTRYPOINT.

Чтобы делать то, что вам нужно, вам нужно только указать cmd и переопределить /bin/bash, Не совсем «пустой», но он выполняет работу на 99%.


18
2018-06-12 07:31



Ой, я забыл детали. За исключением сокращения --loginв -l Я думаю, ваше решение уже так хорошо, как и получается. - Simon Thum
Вот забавная вещь, которую я видел сегодня: команда не переопределена, она добавлена. Вот PS изнутри контейнера. Обратите внимание, что добавленная мной команда была эхо-настройкой db, а встроенная команда - / usr / bin / geth. Также я установил точку входа «». 1 ? Ssl 0:00 /usr/bin/geth echo setting up db - Paul S
Ссылка ссылки докера больше не работает - не может найти очевидной замены для нее. - Chris Kimpton
Я просто исправил это, но мне также было трудно найти (( - Simon Thum


Для тех, кто приступает к переопределению команды entrypoint AND для передачи другой команды, например. запустите bash вместо сценария точки входа, а затем запустите некоторую другую команду с параметрами (мне было непонятно из других ответов):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' является параметром для /bin/sh поэтому здесь вы можете передать любую команду, которую вы хотите запустить в контейнере. /bin/sh для альпийских изображений, /bin/bash скорее всего, для других изображений.


7
2018-05-04 07:28



команды командной строки addtion должны быть написаны на основе json, поэтому вместо цитирования с одинарными кавычками '...' использовать двойные кавычки "..." - Jimmy Obonyo Abor