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


123

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

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

В настоящее время я делаю:

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

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

Ответы:


126

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

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

РЕДАКТИРОВАТЬ: Начиная с Docker 1.3 вы можете использовать execдля запуска процесса в работающем контейнере. Запустите свой контейнер, как обычно, и затем введите его, выполнив:

docker exec -it $CONTAINER_ID /bin/bash

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


Разве это не будет выполнять "/ usr / sbin / apache2ctl / bin / bash"? (поскольку ваш пример не переопределяет точку входа, он будет использовать точку входа, определенную в Dockerfile - или я что-то упустил?)
warp

Возможно, это отличается от старых / новых версий докеров? Это, безусловно, запускает точку входа для меня: gist.github.com/warpr/26a5cc471dce7fcf9021 . Это использует Docker 0.10.0 на Ubuntu 13.10.
Деформация

4
Я знаю, что прохождение --entrypoint переопределяет точку входа. Но когда я использую --entrypoint, как мне переопределить CMD, чтобы он был пустым? (Для bash я могу использовать что-то вроде -i или --login, но не все точки входа, которые я мог бы использовать, будут иметь эквивалентный «фиктивный» аргумент).
Деформация

1
По крайней мере в Docker v1.11.1 кажется, что переопределение --entrypoint также предотвращает нормальное добавление CMD к точке входа. Кажется, что это происходит только тогда, когда точка входа не переопределена.
Жасмин Хегман

1
Почему -iпосле $IMAGE?
Эяль Левин

27

Смотрите: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

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

CMD (команда или параметры по умолчанию). Вспомните необязательную КОМАНДУ в командной строке Docker:

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

Эта команда является необязательной, поскольку пользователь, создавший ИЗОБРАЖЕНИЕ, возможно, уже предоставил КОМАНДУ по умолчанию, используя CMD Dockerfile. Как оператор (человек, управляющий контейнером из образа), вы можете переопределить этот CMD, просто указав новую КОМАНДУ.

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

Таким образом, чтобы сделать то, что вы хотите, вам нужно только указать cmd и переопределить с помощью /bin/bash. Не совсем "пусто", но оно выполнено на 99%.


Ой, я упустил из виду детали. Для сокращения За исключением --loginдо -lЯ думаю , ваше решение уже так хорошо , как он получает.
Саймон Тум

Вот забавная вещь, которую я увидел сегодня: команда не отменяется, она добавляется. Вот PS изнутри контейнера. Обратите внимание, что команда, которую я добавил, была echo "настройка базы данных", а встроенная команда - / usr / bin / geth. Также я установил точку входа как "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Пол С

Ссылка на докер больше не работает - не могу найти очевидную замену.
Крис Кимптон

Я только исправил это, но мне также было трудно найти; (
Саймон Тум,

15

Для тех, кто приходит сюда, чтобы переопределить команду точки входа И для передачи другой команды, например, запустить 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скорее всего для других изображений.


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

Или просто передайте столько аргументов --entrypoint, сколько захотите
Ник Роз

похоже, это не работает: "exec: \" - c \ ": исполняемый файл не найден в $ PATH": неизвестно.
Ричард

Проверьте путь в контейнере, возможно, он действительно не существует. Большинство изображений есть, /bin/shно у вас может не быть такого.
информация
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.