Wie kann man einen Hauptprozess untersuchen, der in einem Docker-Container gestorben ist?

13

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 startSie 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 commitdann docker runauf dem neuen Bild mit einem anderen Befehl tun , aber ich frage mich, ob es andere Alternativen gibt.

Hinweis : docker logsGibt nur alles zurück, was die Apps an stdout / stderr gedruckt haben. Das könnte nicht ausreichen, um herauszufinden, wo das Problem lag.

SztupY
quelle
Nach einer Weile darüber nachdenken: Docker Hauptprozess ???? Als Container, der nur einen Prozess ausführen soll, muss entweder der Begriff "main" entfernt werden, oder Sie tun etwas Seltsames (wie das Ausführen eines Init-Prozesses), oder Sie nehmen Threads als Prozesse ... Ich nehme an, es ist so Option eins, aber ich musste es sagen, weil es mich stört
Tensibai
@Tensibai Manchmal muss man so etwas wie dummes Init ausführen, um das Problem mit der PID 1 / Signalisierung in Containern zu lösen, wenn Ihr Hauptbefehl es nicht selbst behandeln kann. Es kann auch andere Fälle geben, in denen ein Docker-Container mehr als einen Prozess
ausführt
Ja, das nenne ich seltsam, hauptsächlich weil Container erstellt wurden, um einen Prozess zu isolieren. Manchmal sind Container nicht die Lösung für eine App. Die Bereitschaft, alles in einen Container zu packen, ist mehr ein Weg zu Kopfschmerzen als alles andere.
Tensibai

Antworten:

9

Allgemeine Möglichkeiten, um zu verfolgen, warum ein Prozess unter Linux fehlgeschlagen ist, sind gut. Eine Möglichkeit besteht darin, einen Prozess auszuführen, straceder 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:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

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 , stracemit der -ffOption. Sie können einige Dateien auch mithilfe von Docker-Datenvolumes zuordnen und die -oOption von verwenden strace, um darauf zu schreiben. Im Allgemeinen stracebleibt die Ausgabe jedoch auf stdout, was mit gelesen werden kann docker log.

Verwandte F: Der Linux-Prozess wird auf mysteriöse Weise beendet

Evgeny
quelle
Dies bedeutet, dass ich immer noch zuerst in docker commitmeinem angehaltenen Container sein muss, um ein Bild zu starten
SztupY
Du hast gesagt, es stirbt beim Start. Ich nehme an, Sie haben dann ein Bild. Für diejenigen, die gestoppt werden, ist ja ein Commit erforderlich.
Evgeny
Das ist nur eines der Szenarien, um einen gestoppten Container zu bekommen
SztupY
Es gibt auch ein Paket für stracein Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Verwenden Sie den Alpine-Paketmanager, um es zu installieren apk install strace.
Evgeny
3

Soweit ich weiß, commitund runhier 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 runeine Alternative --entrypointund angeben CMD. 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.

Tayworm
quelle