Manchmal muss man einen Container untersuchen, der gestoppt ist, oder einen Container, der nach dem Start sehr schnell stirbt und stoppt.
docker exec -ti <id> bash
Funktioniert nur beim Ausführen von Containern. Sobald der Vorgang abgeschlossen ist, wird auch die Bash-Eingabeaufforderung beendet.
Mit können docker start
Sie keinen anderen Befehl eingeben, und wenn der Container plötzlich wieder stirbt, haben Sie nicht genug Zeit, um in den Container zu gelangen und Ihre Untersuchungen durchzuführen.
Wir können docker commit
dann docker run
auf dem neuen Bild mit einem anderen Befehl tun , aber ich frage mich, ob es andere Alternativen gibt.
Hinweis : docker logs
Gibt nur alles zurück, was die Apps an stdout / stderr gedruckt haben. Das könnte nicht ausreichen, um herauszufinden, wo das Problem lag.
quelle
Antworten:
Allgemeine Möglichkeiten, um zu verfolgen, warum ein Prozess unter Linux fehlgeschlagen ist, sind gut. Eine Möglichkeit besteht darin, einen Prozess auszuführen,
strace
der Ihnen mitteilt, dass der Systemaufrufprozess ausgeführt wurde, und normalerweise auf den Grund für einen Fehler hinweist.Sie können eine erstellen
Dockerfile
, die ungefähr so aussieht:Führen Sie dann Ihr neues Image mit aus
docker run debug_version strace original_cmd
.Für Prozesse , die Gabel Kinder (und dann sterben) Sie ausführen möchten ,
strace
mit der-ff
Option. Sie können einige Dateien auch mithilfe von Docker-Datenvolumes zuordnen und die-o
Option von verwendenstrace
, um darauf zu schreiben. Im Allgemeinenstrace
bleibt die Ausgabe jedoch auf stdout, was mit gelesen werden kanndocker log
.Verwandte F: Der Linux-Prozess wird auf mysteriöse Weise beendet
quelle
docker commit
meinem angehaltenen Container sein muss, um ein Bild zu startenstrace
in Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Verwenden Sie den Alpine-Paketmanager, um es zu installierenapk install strace
.Soweit ich weiß,
commit
undrun
hier sind die besten Optionen , die Sie vollen Zugriff auf den Behälter geben , wie es war , als es starb.Im Idealfall würde Ihr Container bei einem Ausfall weitere nützliche Informationen ausspucken, aber das ist insgesamt ein anderes Thema.
Bearbeiten: Um meine Antwort zu erweitern, wenn der Container gleich beim Start stirbt, können Sie auch
docker run
eine Alternative--entrypoint
und angebenCMD
. Im Allgemeinen setze ich dies auf eine Schleife oder etwas, das nicht von alleine beendet wird. Sobald Sie sich im Container befinden, können Sie die fehlgeschlagenen Schritte manuell ausführen und dann das Ergebnis überprüfen, ohne sich Gedanken über das Verlassen des Containers machen zu müssen.quelle