Ich schreibe ein sehr einfaches Bash-Skript, um schnell zu überprüfen, ob mein Container noch erstellt und korrekt gestartet wird und ob die darin enthaltene App auf Anforderungen reagiert.
docker run
Schlägt manchmal fehl, z. B. weil der Port, an den ich den Container binden möchte, bereits zugewiesen ist. In diesem Fall ist docker run
der Exit-Code jedoch immer noch 0, sodass ich den Exit-Code nicht verwenden kann. Wie kann ich programmgesteuert überprüfen, ob der Container korrekt gestartet wurde?
Die Lösungen, die ich in Betracht ziehe, sind:
- Analysieren Sie die Ausgabe auf Fehler
docker ps
um zu sehen, ob der Container läuft
aber diese beiden scheinen ein wenig übertrieben und hässlich. Vermisse ich einen besseren Weg, um zu überprüfen, ob dies docker run
erfolgreich war?
docker run
bei einem Fehler ein Rückkehrcode ungleich Null zurückgegeben wird, wie Sie angeben, können Sie nur die Ausgabe analysieren (die kompliziert oder fragil sein kann) oder einen anderen Befehl verwenden (dh Ihrenps
Vorschlag) ), um das Ergebnis des ersten Befehls zu überprüfen. Vielleicht möchten Sie ein Ticket bei Docker einreichen, um zu sehen, ob sie auch den Rückkehrcode von Docker korrigieren könnenrun
.docker run -d -p 9010:9010 busybox true ; echo $?
Antworten:
Wie von Abel Muiño in den Kommentaren vorgeschlagen, wurde dies möglicherweise in neueren Docker-Versionen behoben (ich verwende derzeit 0.9.1).
Wenn Sie jedoch vorübergehend wie ich mit einer älteren Version nicht weiterkommen, habe ich eine angemessene Problemumgehung gefunden, um zu überprüfen, ob der Container mit der Verwendung begonnen hat
docker inspect
.docker inspect
Gibt ein JSON-Objekt mit vielen Informationen zum Container zurück, insbesondere, ob der Container gerade ausgeführt wird oder nicht. Mit dem-f
Flag können Sie einfach die benötigten Bits extrahieren:oder
wird zurückkehren
true
oderfalse
.Beachten Sie, dass Sie wahrscheinlich
sleep 1
(oder mehr) zwischen dem Starten des Containers und dem Überprüfen, ob er aktiv ist, möchten . Wenn etwas mit Ihrem Setup nicht stimmt, wird es möglicherweise für eine sehr kurze Zeit als "laufend" angezeigt, bevor es tatsächlich beendet wird.quelle
docker inspect -f {{.State.Running}} <container-id>
und verwendenjq
? Ich wundere mich nur.2> /dev/null
.2> /dev/null
da keine Auswertung erfolgt. Wie kann ich festlegen,false
dass der Container nicht vorhanden ist?Um zu vermeiden, dass etwas analysiert wird, können Sie Docker Top verwenden , das 1 zurückgibt, wenn der Container nicht ausgeführt wird:
quelle
Wir könnten gebrauchen
docker exec $id true 2>/dev/null || echo not running
.Dieser Befehl schreibt nicht wie "Docker Top" in stdout. Es schreibt in stderr, wenn der Container nicht ausgeführt wird, dieselbe Meldung wie "Docker Top".
quelle
Anwenden der oben genannten Vorschläge auf ein Skript.
1 - Erstellen Sie ein Skript keepMyDockerUp.sh :
2 - Fügen Sie es dann einfach zu cron hinzu, damit Ihr Skript von Zeit zu Zeit überprüft, ob Ihr Docker-Container aktiv ist:
Gehen Sie zur letzten Zeile und fügen Sie Ihre Skriptdatei hinzu. Beispielsweise:
3 - Speichern Sie crontab und machen Sie sich keine Sorgen, dass Ihr Docker-Container wieder heruntergefahren wird.
Ich hoffe es hilft...
;-);
quelle
Ich musste verwenden:
(Der Container wurde ausgeführt, aber der Dienst im Container wurde nicht vollständig gestartet.
Teil der Inspektionsausgabe:
quelle