Siehe den vollständigen Befehl zum Ausführen / Stoppen des Containers in Docker

262

Wie kann ich den vollständigen Befehl eines laufenden Containers / Prozesses in Docker sehen?

$ 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

Ich kann hier nur "nginx -g 'daemon of" sehen, nicht den vollständigen Befehl.

Niklas9
quelle
2
siehe auch hier: stackoverflow.com/q/32758793/1747983
Tilo

Antworten:

542

docker ps --no-trunc zeigt den vollständigen Befehl zusammen mit den anderen Details der laufenden Container an.

Scott S.
quelle
13
Danke, das hat sehr geholfen. Nur eine Anmerkung: '-notrunc' ist veraltet und wird durch ersetzt --no-trunc.
Prometheus
2
Das hat bei mir nicht funktioniert. Es gab mir den Befehl, aber nicht alle Schalter (woran ich denke, wenn ich "Vollbefehl" verwende). Der oben erwähnte Befehl runlike hat bei mir besser funktioniert.
Dylan Smith
1
Für den vollständigen Befehl, nur Container auszuführen, entfernen Sie einfach den Befehl all. docker ps --no-trunc
Jacob Morris
Danke - korrigiert. Mein vorheriger Befehl war für alle Container und nicht nur für das Ausführen von Containern, was die ursprüngliche Frage war.
Scott S.
Der nicht abgeschnittene Befehl kann sehr lang sein. Sehen Sie nur die ersten 400 Zeichen in jeder Zeile mitdocker ps --all --no-trunc|cut -c-400
rubo77
183

Verwenden:

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

... führt eine "Docker-Inspektion" für alle Container durch.

st0ne
quelle
8
Der Docker-Befehl ps wird nicht angezeigt. Der Befehl docker ps entspricht dem Docker inspect Path and Args.
JDiMatteo
3
Kein bueno ab Januar 2018
sg
4
dhdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul
2
Wenn Sie nur sudovor den Befehl werfen , erhalten Sie "docker inspect" requires at least 1 argument(s).aufgrund des zweiten Aufrufs, um alle Containernamen abzurufen, wahrscheinlich einen Sudo direkt innerhalb des Befehls $(.
RandomInsano
und für diejenigen, die die -f-Abfrage besser verstehen wollen, habe ich hier eine gute Erklärung gefunden container-solutions.com/docker-inspect-template-magic
intijk
16

Verwenden:

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

Daraufhin werden der Befehlspfad und die Argumente angezeigt, ähnlich wie docker ps.

JDiMatteo
quelle
Wie würden Sie dies ändern, um nach einem bestimmten Befehl zu suchen, z kube-apiserver.
Jonathan
@ Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw
8

Verwenden Sie runlike aus dem Git-Repository https://github.com/lavie/runlike

Runlike installieren

pip install runlike

Da die Container-ID als Argument akzeptiert wird, verwenden Sie den folgenden Befehl, um die Container-ID zu extrahieren

docker ps -a -q

Sie können runlike verwenden, um den vollständigen Docker-Ausführungsbefehl mit dem folgenden Befehl zu extrahieren

runlike <docker container ID>
Abhishek Jain
quelle
Funktioniert nicht Show "Command '[' Docker ',' Inspect ', u'06e6a369f909'] 'hat den Exit-Status 1 ungleich Null zurückgegeben"
fstang
Haben Sie runlike installiert, wie ich erwähnt habe
Abhishek Jain
5
Noch besser ist es, wenn Sie in einem Docker-Container wie ein Lauf laufen und dessen Installation vermeiden:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith,
3

TL-DR

docker ps --no-truncund docker inspect CONTAINERgeben Sie den Einstiegspunkt an, der ausgeführt wird, um den Container entlang des an übergebenen Befehls zu starten. Dabei können jedoch einige Teile fehlen, z. B. ${ANY_VAR}weil Container-Umgebungsvariablen nicht als aufgelöst gedruckt werden.

Dies zu überwinden docker inspect CONTAINERhat einen Vorteil, da es auch ermöglicht, separat env-Variablen und ihre im Container definierten Werte aus der Config.EnvEigenschaft abzurufen .

docker psund docker inspectInformationen über den ausgeführten Einstiegspunkt und seinen Befehl bereitstellen. Oft ist dies ein Wrapper-Einstiegspunkt-Skript ( .sh) und nicht das vom Container gestartete "echte" Programm. Um Informationen dazu zu erhalten, fordern Sie Prozessinformationen mit psoder /proc/1/cmdlineHilfe an.


1) docker ps --no-trunc

Es druckt den Einstiegspunkt und den Befehl, der für alle laufenden Container ausgeführt wird. Während der an den Einstiegspunkt übergebene Befehl gedruckt wird (wenn wir diesen übergeben), wird der Wert der Docker-Env-Variablen (wie $FOOoder ${FOO}) nicht angezeigt .
Wenn unsere Container env-Variablen verwenden, reicht dies möglicherweise nicht aus.

Führen Sie beispielsweise einen alpinen Container aus:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

Bei Verwendung von Docker -ps wie:

Docker ps -a --filtername = alpines Beispiel --no-trunc

Es druckt:

BEHÄLTER-ID BILDBEFEHL ERSTELLTE STATUS-PORTS-NAMEN
5b064a6de6d8417 ... alpine: letzter "sh -c 'ls $ MY_VAR'" vor 2 Minuten Beendet (0) vor 2 Minuten alpines Beispiel

Wir sehen den Befehl an den Einstiegspunkt übergeben: ist sh -c 'ls $MY_VAR'aber $MY_VAR in der Tat nicht gelöst.

2) docker inspect CONTAINER

Wenn wir den alpinen Beispielcontainer inspizieren:

docker inspect alpine-example | grep -4 Cmd

Der Befehl ist auch vorhanden, aber der Wert der env-Variablen wird immer noch nicht angezeigt:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

Tatsächlich konnten wir mit diesen Docker-Befehlen keine interpolierten Variablen sehen.
Als Kompromiss konnten wir sowohl Befehls- als auch Umgebungsvariablen für einen Container mit Docker Inspect separat anzeigen:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

Das druckt:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

Ein weiterer Docker-Weg wäre die Verwendung des --formatFlags docker inspect, mit dem JSON-Attribute zum Rendern angegeben werden können:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

Das gibt aus:

/ alpines Beispiel [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]

3) Rufen Sie den gestarteten Prozess aus dem Container selbst ab, um Container auszuführen

Der von Docker ausgeführte Einstiegspunkt und der Befehl können hilfreich sein, reichen jedoch in einigen Fällen nicht aus, da dies "nur" ein Wrapper-Einstiegspunktskript ( .sh) ist, das für den Start des Real / Core-Prozesses verantwortlich ist.
Wenn ich beispielsweise einen Nexus-Container ausführe, wird der Befehl ausgeführt und angezeigt, um den Container auszuführen "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Für PostgreSQL ist das "docker-entrypoint.sh postgres".

Um weitere Informationen zu erhalten, können wir einen laufenden Container ausführen docker exec CONTAINER ps aux.
Möglicherweise werden andere Prozesse gedruckt, die uns möglicherweise nicht interessieren.
Um uns auf den ursprünglichen Prozess zu beschränken, der vom Einstiegspunkt gestartet wurde, können wir Folgendes tun:

docker exec CONTAINER ps -1

Ich 1gebe an , weil der vom Einstiegspunkt ausgeführte Prozess im Allgemeinen der mit der 1ID ist.

Ohne pskönnten wir die Informationen immer noch in finden /proc/1/cmdline(in den meisten Linux-Distributionen, aber nicht in allen). Zum Beispiel :

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

Wenn wir Zugriff auf den Docker-Host haben, der den Container gestartet hat, ist eine andere Alternative, um den vollständigen Befehl des vom Einstiegspunkt ausgeführten Prozesses abzurufen, :: Ausführen, ps -PIDwobei PID der lokale Prozess ist, der vom Docker-Dämon zum Ausführen des Containers erstellt wurde, z.

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

Benutzerfreundliche Formatierung mit Docker ps

docker ps --no-truncist nicht immer leicht zu lesen.
Wenn Sie Spalten zum Drucken und in Tabellenform angeben, wird dies möglicherweise besser:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

Das Erstellen eines Alias ​​kann helfen:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'
davidxxx
quelle
2

Dylans Kommentar in eine vollständige Antwort verwandeln, weil ZU NÜTZLICH:

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

Was tut es? Führt https://github.com/lavie/runlike in einem Container aus, erhält den vollständigen Docker-Ausführungsbefehl und entfernt den Container für Sie.

Gunar Gessner
quelle