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