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