Vedere il comando completo del contenitore in esecuzione / arrestato in Docker


263

Come posso vedere il comando completo di un container / processo in esecuzione in 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

Posso vedere solo "nginx -g 'daemon di" .. qui, non il comando completo.


Risposte:


545

docker ps --no-trunc visualizzerà il comando completo insieme agli altri dettagli dei contenitori in esecuzione.


13
Grazie questo ha aiutato molto. Solo una nota: '-notrunc' è deprecato, sostituito da --no-trunc.
Prometeo

2
Questo non ha funzionato per me. Mi ha dato il comando ma non tutti gli switch (che è quello che penso quando uso "comando completo"). Il comando runlike menzionato nell'altro link sopra ha funzionato meglio per me.
Dylan Smith,

1
per il comando completo dei soli contenitori in esecuzione, basta rimuovere tutto il comando. docker ps --no-trunc
Jacob Morris,

Grazie - corretto. Il mio comando precedente era per tutti i container e non solo per eseguire container che era la domanda originale.
Scott S.

Il comando non troncato può essere molto lungo, vedi solo i primi 400 caratteri per rigadocker ps --all --no-trunc|cut -c-400
rubo77

183

Uso:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... esegue un "controllo docker" per tutti i contenitori.


8
Questo non visualizza il comando ps docker. Il comando ps finestra mobile corrisponde a finestra mobile ispeziona Path e Args.
JDiMatteo,

3
No bueno a partire da gennaio 2018
sg

4
vale a diredocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul,

2
Se stai semplicemente lanciando sudodavanti al comando, otterrai a "docker inspect" requires at least 1 argument(s).causa della seconda chiamata per ottenere tutti i nomi dei container, probabilmente vorrai aggiungere un sudo appena dentro il $(.
RandomInsano

e per coloro che desiderano una migliore comprensione della query -f, ho trovato una buona spiegazione qui container-solutions.com/docker-inspect-template-magic
intijk

16

Uso:

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

Verranno visualizzati il ​​percorso del comando e gli argomenti, simili a docker ps.


Come lo modifichereste per cercare un comando specifico come kube-apiserver?
Jonathan,

@Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw,

8

Usa runlike dal repository git https://github.com/lavie/runlike

Per installare runlike

pip install runlike

Poiché accetta l'id contenitore come argomento in modo da estrarre l'ID contenitore, utilizzare il comando seguente

docker ps -a -q

È consigliabile utilizzare runlike per estrarre il comando di esecuzione docker completo con il comando seguente

runlike <docker container ID>

Non funziona Mostra "Il comando '[' docker ',' inspect ', u'06e6a369f909'] 'ha restituito uno stato di uscita diverso da zero 1"
fang il

Hai installato runlike come ho già detto
Abhishek Jain,

5
Ancora meglio è possibile eseguire runlike all'interno di un contenitore docker ed evitare di installarlo:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith,

3

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

2

Spostare il commento di Dylan in una risposta completa perché TROPPO UTILE:

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

Che cosa fa? Esegue https://github.com/lavie/runlike all'interno di un contenitore, ti dà il comando completo di esecuzione docker, quindi rimuove il contenitore per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.