it-swarm.com.de

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

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 Richtlinie restart: always Nicht zu funktionieren scheint, wenn ich den Container beende (Simulation eines App-Absturzes mit docker kill) Und Docker-Compose meinen Container nicht neu startet, obwohl die Der Exit-Code lautet 137. Ich beobachte das gleiche Verhalten, wenn ich die Richtlinie restart: on-failure Verwende. Die Versionen 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 den abgestürzten (getöteten) Container nicht neu?
  2. Wie überprüfe ich, ob die Neustartrichtlinie funktioniert?
26
Marcin Zablocki

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 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, Neustart Ihres Servers, Verwenden einer CMD in einem Container und Ausführen eines Exits ...

Wenn ich beispielsweise meinen mit einer Neustartrichtlinie bereitgestellten Container beende, wird er mit Code 137 beendet, aber nicht gemäß Docker ps -a neu gestartet. Er bleibt beendet:

[[email protected] ~]# 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 ...

[[email protected] ~]# 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, der mit der Neustartrichtlinie festgelegt wurde, wird erneut gestartet. Dies wird in der Dokumentation angegeben. Docker-Kill ist daher 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, einen Neustart zu verhindern Schleifen, 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 ist also kein Fehler, sondern das erwartete Verhalten):

22
Miguel A. C.