Wie funktioniert die Richtlinie "Neustart: Immer" in Docker-Compose?

23

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: alwaysRichtlinie 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-failureRichtlinien verwende. Versionen 2und 3von docker-compose verhalten sich gleich. Mein System ist Ubuntu Server 16.04 x64.

Meine Fragen sind:

  1. Warum startet docker-compose den abgestürzten (getöteten) Container nicht neu?
  2. Wie überprüfe ich, ob die Neustart-Richtlinie funktioniert?
Marcin Zablocki
quelle
1
Ich war viele Male dort, aber wie Sie sehen, ist die Dokumentation nicht robust und es gibt keine Erklärung, wie diese Funktion funktioniert. Deshalb habe ich eine Frage gestellt. Ich möchte eine Antwort von jemandem mit praktischer Erfahrung auf diesem Gebiet erhalten.
Marcin Zablocki

Antworten:

19

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:

[root@andromeda ~]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   3 minutes ago       Exited (137) 34 seconds ago                       keepalive_redis_1

Aber wenn ich den Daemon neu starte ...

[root@andromeda ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   30 minutes ago      Up 2 seconds        6379/tcp            keepalive_redis_1

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):

Miguel AC
quelle