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.
Antworten:
docker ps --no-trunc
zeigt den vollständigen Befehl zusammen mit den anderen Details der laufenden Container an.quelle
--no-trunc
.docker ps --no-trunc
docker ps --all --no-trunc|cut -c-400
Verwenden:
... führt eine "Docker-Inspektion" für alle Container durch.
quelle
docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
sudo
vor 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$(
.Verwenden:
Daraufhin werden der Befehlspfad und die Argumente angezeigt, ähnlich wie
docker ps
.quelle
kube-apiserver
.docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
Verwenden Sie runlike aus dem Git-Repository https://github.com/lavie/runlike
Runlike installieren
Da die Container-ID als Argument akzeptiert wird, verwenden Sie den folgenden Befehl, um die Container-ID zu extrahieren
Sie können runlike verwenden, um den vollständigen Docker-Ausführungsbefehl mit dem folgenden Befehl zu extrahieren
quelle
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
TL-DR
docker ps --no-trunc
unddocker 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 derConfig.Env
Eigenschaft abzurufen .docker ps
unddocker 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 mitps
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:
Bei Verwendung von Docker -ps wie:
Es druckt:
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:
Der Befehl ist auch vorhanden, aber der Wert der env-Variablen wird immer noch nicht angezeigt:
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:
Das druckt:
Ein weiterer Docker-Weg wäre die Verwendung des
--format
Flagsdocker inspect
, mit dem JSON-Attribute zum Rendern angegeben werden können:Das gibt aus:
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:
Ich
1
gebe an , weil der vom Einstiegspunkt ausgeführte Prozess im Allgemeinen der mit der1
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 :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.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:
Das Erstellen eines Alias kann helfen:
quelle
Dylans Kommentar in eine vollständige Antwort verwandeln, weil ZU NÜTZLICH:
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.
quelle