Смотрите полную команду запуска / остановки контейнера в Docker

264

Как я могу увидеть полную команду работающего контейнера / процесса в 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 'daemon of" .. здесь, а не полную команду.

Niklas9
источник
2
смотрите здесь также: stackoverflow.com/q/32758793/1747983
Тило

Ответы:

546

docker ps --no-trunc отобразит полную команду вместе с другими деталями запущенных контейнеров.

Скотт С.
источник
13
Спасибо, это очень помогло. Просто примечание: «-notrunc» устарел, заменен на --no-trunc.
Прометей
2
Это не сработало для меня. Он дал мне команду, но не все переключатели (о чем я думаю, когда использую «полную команду»). Команда runlike, упоминавшая другую ссылку выше, работала для меня лучше.
Дилан Смит
1
для полной команды только запущенных контейнеров просто удалите команду all. 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)

... он выполняет «проверку докера» для всех контейнеров.

st0ne
источник
8
Это не отображает команду docker ps. Команда docker ps соответствует docker inspect Path и Args.
JDiMatteo
3
Нет Буэно по состоянию на январь 2018 года
к.с.
4
то естьdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Пол
2
Если вы просто набрасываете sudoкоманду, вы получите "docker inspect" requires at least 1 argument(s).из-за второго вызова все имена контейнеров, возможно, вы захотите добавить sudo только внутри $(.
RandomInsano
и для тех, кто хочет лучше понять запрос -f, я нашел хорошее объяснение здесь container-solutions.com/docker-inspect-template-magic
intijk
16

Использование:

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

Это покажет путь к команде и аргументы, похожие на docker ps.

JDiMatteo
источник
Как бы вы изменили это для поиска конкретной команды, например 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 с помощью следующей команды

runlike <docker container ID>
Абхишек Джайн
источник
Не работает Show "Command" ['docker', 'inspect', u'06e6a369f909 ']' вернул ненулевой статус выхода 1 "
fstang
Установили ли вы подобный бегу, как я уже упоминал
Абхишек Джайн,
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есть преимущество, поскольку оно также позволяет извлекать переменные env и их значения, определенные в контейнере, из Config.Envсвойства.

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


1) docker ps --no-trunc

Он печатает точку входа и команду, выполненную для всех работающих контейнеров. Хотя он печатает команду, переданную точке входа (если мы ее передаем), он не показывает значения переменных env docker (таких как $FOOили ${FOO}).
Если наши контейнеры используют переменные env, этого может быть недостаточно.

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

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

При использовании docker -ps, таких как:

docker ps -a --filter name = alpine-example --no-trunc

Это печатает:

КОНТЕЙНЕР ID ИМИДЖ КОМАНДА СОЗДАННЫЕ СТАТУС ИМЕНА ПОРТ
5b064a6de6d8417 ... alpine: последняя "sh -c 'ls $ MY_VAR'" 2 минуты назад Exited (0) 2 минуты назад alpine-example

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

2) docker inspect CONTAINER

Когда мы проверяем контейнер alpine-example:

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 -PIDгде 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}}"'
davidxxx
источник
2

Перемещение комментария Дилана в полномасштабный ответ, потому что СЛИШКОМ ПОЛЕЗНО:

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

Что оно делает? Запускает https://github.com/lavie/runlike внутри контейнера, получает полную команду запуска docker, а затем удаляет контейнер для вас.

Гунар Гесснер
источник