419 Stimmen

Siehe den vollständigen Befehl zum Starten/Stoppen eines Containers in Docker

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 Minuten ago    Beendet (0) 4 Minuten ago            thirsty_brattain

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

835voto

Scott S. Punkte 8490

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

197voto

st0ne Punkte 4045

Verwendung:

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

... führt einen "docker inspect" für alle Container durch.

24voto

davidxxx Punkte 114488

TL-DR

docker ps --no-trunc und docker inspect CONTAINER zeigen den ausgeführten Einstiegspunkt zum Starten des Containers sowie den übergebenen Befehl, aber das kann einige Teile wie ${ANY_VAR} verpassen, da Umgebungsvariablen des Containers nicht aufgelöst gedruckt werden.

Um das zu überwinden, hat docker inspect CONTAINER einen Vorteil, da es auch erlaubt, Umgebungsvariablen und ihre Werte getrennt im Container aus der Config.Env Eigenschaft abzurufen.

docker ps und docker inspect geben Informationen über den ausgeführten Einstiegspunkt und dessen Befehl. Oft handelt es sich dabei um ein Wrapper-Einstiegsskript (.sh) und nicht das "echte" Programm, das vom Container gestartet wird. Um Informationen dazu zu erhalten, hilft es, Prozessinformationen mit ps oder /proc/1/cmdline anzufordern.


1) docker ps --no-trunc

Es zeigt den Einstiegspunkt und den ausgeführten Befehl für alle laufenden Container an. Obwohl es den an den Einstiegspunkt übergebenen Befehl druckt (wenn wir diesen übergeben), zeigt es nicht den Wert von Docker-Umgebungsvariablen (wie $FOO oder ${FOO}).
Wenn unsere Container Umgebungsvariablen verwenden, könnte das nicht ausreichen.

Zum Beispiel führen Sie einen alpine-Container aus:

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

Bei der Verwendung von Docker -ps wie folgt:

docker ps -a --filter name=alpine-example --no-trunc

Es druckt:

CONTAINER ID           IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
5b064a6de6d8417...   alpine:latest       "sh -c 'ls $MY\_VAR'"   vor 2 Minuten       Beendet (0) vor 2 Minuten                       alpine-example

Wir sehen den an den Einstiegspunkt übergebenen Befehl: sh -c 'ls $MY_VAR' aber $MY_VAR ist tatsächlich nicht aufgelöst.

2) docker inspect CONTAINER

Wenn wir den alpine-example Container inspizieren:

docker inspect alpine-example | grep -4 Cmd

Der Befehl ist auch dort, aber wir sehen immer noch nicht den Wert der Umgebungsvariable:

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

Tatsächlich könnten wir mit diesen Docker-Befehlen keine interpolierten Variablen sehen.
Als Kompromiss könnten wir jedoch mit docker inspect sowohl Befehl als auch Umgebungsvariablen separat für einen Container 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"
        ]

Eine "richtigere" Docker-Methode wäre die Verwendung des --format Flags von docker inspect, das es ermöglicht, JSON-Attribute zum Rendern zu spezifizieren:

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

Das gibt aus:

/alpine-example \[sh -c ls $MY\_VAR\]  \[MY\_VAR=/var PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\]

3) Abrufen des gestarteten Prozesses aus dem Container selbst für laufende Container

Der Einstiegspunkt und Befehl, der von Docker ausgeführt wird, können hilfreich sein, aber in einigen Fällen reicht das nicht aus, da es sich "nur" um ein Wrapper-Einstiegsskript (.sh) handelt, das dafür verantwortlich ist, den echten/kernigen Prozess zu starten.
Beispielsweise, wenn ich einen Nexus-Container ausführe, ist der ausgeführte und angezeigte Befehl zur Ausführung des Containers "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Für PostgreSQL ist das "docker-entrypoint.sh postgres".

Um mehr Informationen zu erhalten, könnten wir auf einem laufenden Container ausführen docker exec CONTAINER ps aux.
Es könnte andere Prozesse drucken, die uns nicht interessieren könnten.
Um auf den initialen Prozess, der vom Einstiegspunkt gestartet wurde, zu beschränken, könnten wir folgendes tun:

docker exec CONTAINER ps -1

Ich gebe 1 an, da der vom Einstiegspunkt ausgeführte Prozess normalerweise derjenige mit der ID 1 ist.

Ohne ps könnten wir die Informationen immer noch in /proc/1/cmdline finden (in den meisten Linux-Distributionen, aber nicht alle). 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 weitere Alternative, um den vollständigen Befehl des Prozesses, der vom Einstiegspunkt ausgeführt wird, zu erhalten: : Führen Sie ps -PID aus, wobei PID der lokale Prozess ist, der vom Docker-Daemon erstellt wurde, um den Container auszuführen, wie zum Beispiel:

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

Benutzerfreundliche Formatierung mit docker ps

docker ps --no-trunc ist nicht immer einfach zu lesen.
Durch die Angabe von Spalten zum Drucken und in tabellarischer Form kann es besser gemacht werden:

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

22voto

JDiMatteo Punkte 10224

Verwendung:

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

Dies zeigt den Befehlspfad und die Argumente an, ähnlich wie docker ps.

20voto

Gunar Gessner Punkte 1831

Bewege Dylans Kommentar in eine ausführliche Antwort, weil ZU NÜTZLICH:

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

Was macht es? Führt https://github.com/lavie/runlike in einem Container aus, gibt dir den vollständigen docker run Befehl und entfernt dann den Container für dich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X