TL-DR
docker ps --no-trunc
und docker inspect CONTAINER
geben 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 CONTAINER
hat einen Vorteil, da es auch ermöglicht, separat env-Variablen und ihre im Container definierten Werte aus der Config.Env
Eigenschaft abzurufen .
docker ps
und docker inspect
Informationen ü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 ps
oder /proc/1/cmdline
Hilfe 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 $FOO
oder ${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 --format
Flags 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 1
gebe an , weil der vom Einstiegspunkt ausgeführte Prozess im Allgemeinen der mit der 1
ID ist.
Ohne ps
kö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 -PID
wobei 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-trunc
ist 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}}"'