TL-DR
docker ps --no-trunc
e docker inspect CONTAINER
fornire il punto di accesso eseguito per avviare il contenitore, lungo il comando passato a, ma che potrebbe mancare alcune parti come${ANY_VAR}
perché le variabili di ambiente del contenitore non vengono stampate come risolte.
Per ovviare a questo, docker inspect CONTAINER
ha un vantaggio perché consente anche di recuperare separatamente le variabili env e i loro valori definiti nel contenitore dalla Config.Env
proprietà.
docker ps
e docker inspect
fornire informazioni sul punto di accesso eseguito e il suo comando. Spesso si tratta di uno script wrapper entrypoint ( .sh
) e non del programma "reale" avviato dal contenitore. Per ottenere informazioni al riguardo, richiedere informazioni di processo ps
o /proc/1/cmdline
aiuto.
1) docker ps --no-trunc
Stampa l'entrata e il comando eseguito per tutti i contenitori in esecuzione. Mentre stampa il comando passato al punto di accesso (se lo passiamo), non mostra il valore delle variabili env della finestra mobile (come $FOO
o ${FOO}
).
Se i nostri contenitori utilizzano variabili env, potrebbe non essere sufficiente.
Ad esempio, esegui un container alpino:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
Quando si usa la finestra mobile -ps come:
finestra mobile ps -a - nome filtro = alpine-example --no-trunc
Stampa:
ID CONTENITORE COMANDO IMMAGINE STATO CREATO NOME PORTI
5b064a6de6d8417 ... alpine: latest "sh -c 'ls $ MY_VAR'" 2 minuti fa Uscito (0) 2 minuti fa alpine-example
Vediamo il comando passato al punto di accesso: sh -c 'ls $MY_VAR'
ma in $MY_VAR
effetti non viene risolto.
2) docker inspect CONTAINER
Quando ispezioniamo il contenitore di esempio alpino:
docker inspect alpine-example | grep -4 Cmd
Il comando è anche lì ma non vediamo ancora il valore della variabile env:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
In effetti, non è stato possibile visualizzare variabili interpolate con questi comandi docker.
Mentre come trade-off, potremmo visualizzare separatamente sia le variabili command che env per un container con docker inspect:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
Che stampa:
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
Un modo più mobile sarebbe usare il --format
flag docker inspect
che consente di specificare gli attributi JSON per il rendering:
docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example
Che produce:
/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]
3) Recupera il processo avviato dal contenitore stesso per l'esecuzione dei contenitori
L'entrypoint e il comando eseguiti dalla finestra mobile possono essere utili, ma in alcuni casi non sono sufficienti perché si tratta "solo" di uno script wrapper entrypoint ( .sh
) che è responsabile dell'avvio del processo real / core.
Ad esempio, quando eseguo un contenitore Nexus, il comando eseguito e mostrato per eseguire il contenitore è"sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"
.
Per PostgreSQL che è "docker-entrypoint.sh postgres"
.
Per ottenere maggiori informazioni, potremmo eseguire su un container in esecuzione
docker exec CONTAINER ps aux
.
Può stampare altri processi che potrebbero non interessarci.
Per restringere il processo iniziale avviato dal punto di accesso, potremmo fare:
docker exec CONTAINER ps -1
Io specifica 1
perché il processo eseguito dal entrypoint è generalmente quello con l' 1
id.
Senza ps
, potremmo ancora trovare le informazioni in /proc/1/cmdline
(nella maggior parte delle distro Linux ma non in tutte). Per esempio :
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
Se abbiamo accesso all'host docker che ha avviato il contenitore, un'altra alternativa per ottenere il comando completo del processo eseguito dal punto di accesso è:: eseguire ps -PID
dove PID è il processo locale creato dal daemon Docker per eseguire il contenitore come:
ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER)
Formattazione intuitiva con docker ps
docker ps --no-trunc
non è sempre facile da leggere.
Specificare le colonne da stampare e in un formato tabulare potrebbe renderlo migliore:
docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
Creare un alias può aiutare:
alias dps='docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'