TL-DR
docker ps --no-trunce docker inspect CONTAINERfornire 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 CONTAINERha un vantaggio perché consente anche di recuperare separatamente le variabili env e i loro valori definiti nel contenitore dalla Config.Envproprietà.
docker pse docker inspectfornire 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 pso /proc/1/cmdlineaiuto.
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 $FOOo ${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 --formatflag docker inspectche 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' 1id.
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 -PIDdove 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-truncnon è 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}}"'