Дивіться повну команду запуску / зупинки контейнера в Docker


263

Як я бачу повну команду запущеного контейнера / процесу в Docker?

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

Тут я бачу лише "nginx -g 'демон" .., а не повну команду.


2
дивіться також тут: stackoverflow.com/q/32758793/1747983
Тіло

Відповіді:


544

docker ps --no-trunc відобразить повну команду разом з іншими деталями запущених контейнерів.


13
Завдяки цьому дуже допомогло. Просто примітка: '-notrunc' застаріло, замінено на --no-trunc.
Прометей

2
Це не спрацювало для мене. Це дало мені команду, але не всі комутатори (про що я думаю, використовуючи "повну команду"). Командна команда runlike, згадана іншим вище посиланням, працювала краще для мене.
Ділан Сміт

1
для повної команди лише запущених контейнерів просто видаліть всю команду. docker ps --no-trunc
Джейкоб Морріс

Спасибі - виправлено. Моя попередня команда була для всіх контейнерів, а не лише для запуску контейнерів, що було оригінальним питанням.
Скотт С.

Ненавчана команда може бути дуже довгою, побачити лише перші 400 символів у кожному рядкуdocker ps --all --no-trunc|cut -c-400
rubo77

183

Використання:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... він "перевіряє докер" для всіх контейнерів.


8
Це не відображає команду docker ps. Команда docker ps відповідає докер-огляду Path and Args.
JDiMatteo

3
Немає буено станом на січень 2018
sg

4
тобтоdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Пол

2
Якщо ви просто кидаєтеся sudoперед командою, ви отримаєте "docker inspect" requires at least 1 argument(s).через другий виклик, щоб отримати всі назви контейнерів, ви, ймовірно, захочете додати судо просто всередині $(.
RandomInsano

а для тих, хто хоче краще зрозуміти запит -f, я знайшов хороше пояснення тут container-solutions.com/docker-inspect-template-magic
intijk

16

Використання:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

Це відобразить командний шлях та аргументи, подібні до docker ps.


Як би ви змінили це для пошуку певної команди, наприклад kube-apiserver?
Джонатан

@Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw

8

Використовуйте runlike із сховища git https://github.com/lavie/runlike

Щоб встановити runlike

pip install runlike

Оскільки він приймає ідентифікатор контейнера як аргумент, так для вилучення ідентифікатора контейнера використовується наступна команда

docker ps -a -q

Ви можете використовувати runlike, щоб витягти повну команду docker run із наступною командою

runlike <docker container ID>

Не працює. Показати "Command" ['docker', 'inspect', u'06e6a369f909 ']' повернув ненульовий статус виходу 1 "
fstang

Ви встановили, як я вже згадував
Abhishek Jain

5
Ще краще ви можете запустити runlike в контейнер docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Ділан Сміт

3

TL-DR

docker ps --no-truncі docker inspect CONTAINERнадати точку входу, виконану для запуску контейнера, вздовж команди, переданої до, але це може пропустити деякі частини, наприклад, ${ANY_VAR}тому що змінні середовища контейнера не друкуються як вирішені.

Щоб подолати це, docker inspect CONTAINERмає перевагу, оскільки воно також дозволяє отримати Config.Envвластивості окремо env змінних та їх значень, визначених у контейнері .

docker psі docker inspectнадати інформацію про виконану точку входу та її команду. Часто це сценарій введення для обгортки ( .sh), а не "реальна" програма, запущена контейнером. Щоб отримати інформацію про це, запитавши інформацію про процес з допомогою psчи /proc/1/cmdlineдопомогу.


1) docker ps --no-trunc

Він друкує точку входу та команду, виконану для всіх запущених контейнерів. У той час як вона друкує команду, передану в точку входу (якщо ми передамо це), вона не показує значення змінних env env (таких як $FOOабо ${FOO}).
Якщо наші контейнери використовують env-змінні, це може бути недостатньо.

Наприклад, запустіть альпійський контейнер:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

При використанні docker -ps, таких як:

docker ps -a - назва фільтра = альпійський приклад --no-trunc

Він друкує:

ІМЕНТ ІНФОРМАЦІЇ КОНТАЙНЕРУ КОМАНДА СТВОРЕННЯ ІМЕНІВ СТАТУСНИХ ПОРТ
5b064a6de6d8417 ... alpine: останній "sh -c 'ls $ MY_VAR'" 2 хвилини тому Вийшов (0) 2 хвилини тому alpine-example

Ми бачимо, команда передана до точки входу, sh -c 'ls $MY_VAR'але $MY_VAR насправді не вирішена.

2) docker inspect CONTAINER

Коли ми оглядаємо контейнер з альпійським прикладом:

docker inspect alpine-example | grep -4 Cmd

Команда також є, але ми ще не бачимо значення змінної env:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

Насправді ми не могли побачити інтерпольовані змінні з цими командами докера.
Хоча як компроміс, ми можемо відображати окремо як командні, так і env-змінні для контейнера з докером:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

Це відбитки:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

Більш докерним способом було б використання --formatпрапора, docker inspectякий дозволяє вказати атрибути JSON для візуалізації:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

Це виводить:

/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]

3) Отримайте розпочатий процес із самого контейнера для запуску контейнерів

Точка входу та команда, виконана docker, може бути корисною, але в деяких випадках її недостатньо, оскільки це "лише" скрипт вхідної точки обгортки ( .sh), який відповідає за запуск реального / основного процесу.
Наприклад, коли я запускаю контейнер Nexus, команда, виконана та показана для запуску контейнера, є "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Для PostgreSQL, що є "docker-entrypoint.sh postgres".

Щоб отримати більше інформації, ми могли б виконати на запущеному контейнері docker exec CONTAINER ps aux.
Він може друкувати інші процеси, які можуть нас не цікавити.
Щоб звузити початковий процес, запущений точкою входу, ми могли б зробити:

docker exec CONTAINER ps -1

Я вказую, 1тому що процес, що виконується точкою входу, як правило, той, що має 1ідентифікатор.

Без цього psми все ще могли знайти інформацію в /proc/1/cmdline(у більшості дистрибутивів Linux, але не у всіх). Наприклад :

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

Якщо у нас є доступ до хоста докера, який запустив контейнер, інша альтернатива отримати повне командування процесу, виконаного точкою входу, є:: Execute ps -PIDwhere PID - локальний процес, створений демоном Docker для запуску контейнера, наприклад:

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

Зручне форматування за допомогою docker ps

docker ps --no-truncне завжди легко читати.
Визначення стовпців для друку та у табличному форматі може покращити:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

Створення псевдоніма може допомогти:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'

2

Переміщення коментаря Ділана до повномасштабної відповіді, оскільки ПОТРІБНО:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Що це робить? Запускає https://github.com/lavie/runlike всередині контейнера, отримує повну команду запуску докера, а потім видаляє контейнер для вас.

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