Wie funktioniert die Richtlinie "Neustart: immer" in Docker-compose?

Ich habe eine 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 restart: always die Richtlinie scheint nicht zu funktionieren, wenn ich den Container beende (Simulieren des App-Absturzes mit docker kill) und docker-compose startet meinen Container nicht neu, obwohl der Exit-Code ist 137. Ich beobachte das gleiche Verhalten, wenn ich benutze restart: on-failure Politik. Sprachversionen 2 und 3 von Docker-compose verhalten sich gleich. Mein System ist Ubuntu Server 16.04 x64.

Meine Fragen sind:

  1. Warum startet docker-compose abgestürzten (getöteten) Container nicht neu?
  2. Wie überprüfe ich, ob die Neustartrichtlinie funktioniert?

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, eine Neustartschleife zu verhindern. " (Referenz)

Wenn Sie docker stop oder docker kill verwenden, stoppen Sie den Container manuell. Sie können einige Tests zu Neustartrichtlinien durchführen: Neustart des Docker-Dämons, Neustart Ihres Servers, Verwendung eines CMD in einem Container und Ausführen eines Exits...

Wenn ich beispielsweise meinen Container, der mit einer Neustartrichtlinie bereitgestellt wurde, beende, sehe ich, dass er mit Code 137 beendet wurde, aber nicht gemäß docker ps -a neu gestartet wird, sondern beendet bleibt:

[root@andromeda ~]# docker ps --allCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES819d1264c30a        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 psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES819d1264c30a        redis:alpine        "docker-entrypoint..."   30 minutes ago      Up 2 seconds        6379/tcp            keepalive_redis_1

Docker kill ist also nicht die Art und Weise, wie Sie die Neustartrichtlinie testen sollten, da davon ausgegangen wird, dass Sie den Container absichtlich gestoppt haben und Docker eine Möglichkeit haben möchte Verhindern Sie das Neustarten von Schleifen, wenn Sie es töten, möchten Sie es wirklich töten.

Ich fand die folgenden Links wertvoll, die das gleiche Verhalten in verschiedenen Versionen zeigen (es ist also kein Fehler, sondern das erwartete Verhalten):

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 würde gerne eine Antwort von jemandem mit praktischer Erfahrung in diesem Bereich sehen.

Compose specification | Docker Documentation & Compose specification | Docker Documentation