Як я можу змінити CMD під час запуску докерного зображення?


123

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

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

Я зараз роблю:

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

Чи є спосіб замінити CMD, щоб він був порожнім (тому мені не потрібно використовувати "--login")?

Відповіді:


125

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

Потім ви можете оглянути запущений контейнер у тому стані, в якому він повинен працювати.

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

docker exec -it $CONTAINER_ID /bin/bash

Якщо припустимо, що bash встановлений, ви отримаєте доступ оболонки до запущеного контейнера.


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

Це щось, що відрізняється від старих / нових версій докера? Це, безумовно, працює для мене вхідною точкою : gist.github.com/warpr/26a5cc471dce7fcf9021 . Для цього використовується докер 0.10.0 на Ubuntu 13.10.
деформація

4
Я знаю, що передача - вхідна точка перекриває точку входу. Але коли я використовую --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 (команда за замовчуванням або параметри) Нагадаємо необов'язковий COMMAND у командному рядку Docker:

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

Ця команда є необов'язковою, оскільки особа, яка створила IMAGE, можливо, вже надала команду COMMAND за замовчуванням за допомогою CMD Dockerfile. Як оператор (людина, що працює з контейнером із зображення), ви можете перекрити цей CMD, просто вказавши нову команду COMMAND.

Якщо зображення також вказує ENTRYPOINT, то CMD або COMMAND додаються як аргументи до ENTRYPOINT.

Тому для того, щоб робити те, що вам потрібно, потрібно лише вказати cmd та переотримати використання /bin/bash. Не зовсім "порожній", але це робиться на 99%.


На жаль, я пропустив деталь. Для скорочення За винятком --loginдо -lЯ думаю , ваше рішення вже так добре , як він отримує.
Саймон Тум

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

Посилання на докер більше не працює - не може знайти очевидну заміну для нього.
Кріс Кімптон,

Я щойно це виправив, але мені також було важко знайти; (
Simon Thum

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

Або просто передайте скільки завгодно аргументів
нік Роз

це, здається, не працює: "exec: \" - c \ ": виконуваний файл не знайдений у $ PATH": невідомо.
Річард

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