Come funziona la politica "riavvia: sempre" nella finestra mobile-componi?


23

Ho un file di composizione docker con PostgreSQL e la mia applicazione, in questo modo:

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"

Il problema è che la restart: alwayspolitica non sembra funzionare quando uccido il container (simulando l'arresto anomalo dell'app docker kill) e Docker-compose non riavvia il mio container, anche se il codice di uscita è 137 . Osservo lo stesso comportamento quando utilizzo la restart: on-failurepolitica. Le versioni 2e la 3finestra mobile compongono si comportano allo stesso modo. Il mio sistema è Ubuntu Server 16.04 x64.

Le mie domande sono:

  1. Perché docker-compose non riavvia il contenitore bloccato (ucciso)?
  2. Come verificare se la politica di riavvio funziona?


1
Ci sono stato molte volte, ma come puoi vedere, la documentazione non è solida e non ci sono spiegazioni sul funzionamento di questa funzione, ecco perché ho fatto una domanda: vorrei vedere la risposta di qualcuno con esperienza pratica in questo campo.
Marcin Zablocki,

Risposte:


20

Quando si utilizza l'uccisione Docker, questo è il comportamento previsto poiché Docker non riavvia il contenitore: "Se si arresta manualmente un contenitore, i suoi criteri di riavvio vengono ignorati fino al riavvio del daemon Docker o al riavvio manuale del contenitore. Questo è un altro tentativo di impedire un ciclo di riavvio " (riferimento)

Se si utilizza l'arresto della finestra mobile o l'uccisione della finestra mobile, si arresta manualmente il contenitore. È possibile eseguire alcuni test sui criteri di riavvio: riavviare il daemon docker, riavviare il server, utilizzare un CMD all'interno di un contenitore ed eseguire un'uscita ...

Ad esempio se uccido il mio contenitore distribuito con una politica di riavvio, vedo che è uscito con il codice 137 ma non è riavviato secondo la finestra mobile ps -a, rimane uscito:

[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

Ma se riavvio il demone ...

[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

Il contenitore che è stato impostato con la politica di riavvio, ricomincia, ed è ciò che dice la documentazione, quindi l'uccisione della finestra mobile non è il modo in cui dovresti testare la politica di riavvio poiché si presume che tu abbia arrestato deliberatamente il contenitore e Docker vuole avere un modo per impedire il riavvio loop, se lo uccidi, vuoi davvero ucciderlo.

Ho trovato utili i seguenti collegamenti che mostrano lo stesso comportamento in versioni diverse (quindi non è un bug ma il comportamento previsto):

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.