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}}"'