Ich habe Docker-Compose-Datei mit PostgreSQL und meiner Anwendung, wie folgt:
version: '3'
services:
postgresql:
image: postgres:9.6.6
ports:
- 9932:5432
expose:
- "5432"
environment:
- POSTGRES_PASSWORD=pass
restart: always
volumes:
- /data:/var/lib/postgresql/data
myapp:
image: myapp
links:
- postgresql
depends_on:
- "postgresql"
restart: always
ports:
- "5000:5000"
Das Problem ist, dass die restart: always
Richtlinie nicht zu funktionieren scheint, wenn ich den Container beende (simuliere App-Absturz mit docker kill
) und docker-compose meinen Container nicht neu startet, obwohl der Exit-Code 137 lautet . Ich beobachte dasselbe Verhalten, wenn ich restart: on-failure
Richtlinien verwende. Versionen 2
und 3
von docker-compose verhalten sich gleich. Mein System ist Ubuntu Server 16.04 x64.
Meine Fragen sind:
- Warum startet docker-compose den abgestürzten (getöteten) Container nicht neu?
- Wie überprüfe ich, ob die Neustart-Richtlinie funktioniert?
docker
docker-compose
Marcin Zablocki
quelle
quelle
Antworten:
Wenn Sie Docker Kill verwenden, ist dies das erwartete Verhalten, da Docker den Container nicht neu startet: "Wenn Sie einen Container manuell stoppen, wird seine Neustartrichtlinie ignoriert, bis der Docker-Dämon neu gestartet wird oder der Container manuell neu gestartet wird. Dies ist ein weiterer Versuch, dies zu verhindern eine Neustartschleife " (Referenz)
Wenn Sie Docker Stop oder Docker Kill verwenden, stoppen Sie den Container manuell. Sie können einige Tests zu Neustartrichtlinien durchführen: Neustarten des Docker-Daemons, Neustarten des Servers, Verwenden einer CMD in einem Container und Ausführen eines Exits ...
Wenn ich beispielsweise meinen mit einer Neustartrichtlinie bereitgestellten Container beende, sehe ich, dass er mit Code 137 beendet wurde, aber nicht gemäß Docker ps -a neu gestartet wurde. Er bleibt beendet:
Aber wenn ich den Daemon neu starte ...
Der Container, für den eine Neustartrichtlinie festgelegt wurde, wird erneut gestartet. Dies wird in der Dokumentation beschrieben. Daher sollten Sie die Neustartrichtlinie nicht mit docker kill testen, da davon ausgegangen wird, dass Sie den Container absichtlich gestoppt haben und Docker eine Möglichkeit haben möchte, einen Neustart zu verhindern Loops, wenn du es tötest, willst du es wirklich töten.
Ich fand die folgenden Links wertvoll, die das gleiche Verhalten in verschiedenen Versionen zeigen (es handelt sich also nicht um einen Fehler, sondern um das erwartete Verhalten):
quelle