¿Cómo funciona la política de "reinicio: siempre" en docker-compose?

23

Tengo docker componer archivo con PostgreSQL y mi aplicación, así:

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"

El problema es que la restart: alwayspolítica no parece funcionar cuando elimino el contenedor (simulando el bloqueo de la aplicación usando docker kill) y docker-compose no reinicia mi contenedor, a pesar de que el código de salida es 137 . Observo el mismo comportamiento cuando uso la restart: on-failurepolítica. Las versiones 2y 3de docker-compose se comportan igual. Mi sistema es Ubuntu Server 16.04 x64.

Mis preguntas son:

  1. ¿Por qué docker-compose no reinicia el contenedor estrellado?
  2. ¿Cómo verificar si la política de reinicio funciona?
Marcin Zablocki
fuente
1
Estuve allí muchas veces, pero como puede ver, la documentación no es sólida y no hay una explicación de cómo funciona esta característica, por eso hice una pregunta: me gustaría ver la respuesta de alguien con experiencia práctica en este campo.
Marcin Zablocki

Respuestas:

20

Cuando utiliza docker kill, este es el comportamiento esperado ya que Docker no reinicia el contenedor: "Si detiene manualmente un contenedor, su política de reinicio se ignora hasta que el demonio Docker se reinicie o el contenedor se reinicie manualmente. Este es otro intento de evitar un ciclo de reinicio " (referencia)

Si usa docker stop o docker kill, está deteniendo manualmente el contenedor. Puede hacer algunas pruebas sobre las políticas de reinicio: reiniciar el demonio docker, reiniciar su servidor, usar un CMD dentro de un contenedor y ejecutar una salida ...

Por ejemplo, si elimino mi contenedor desplegado con una política de reinicio, veo que salió con el código 137 pero no se reinicia de acuerdo con docker ps -a, permanece salido:

[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

Pero si reinicio el demonio ...

[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

El contenedor que se configuró con la política de reinicio comienza de nuevo, que es lo que dice la documentación, por lo que Docker kill no es la forma en que debe probar la política de reinicio, ya que se supone que ha detenido deliberadamente el contenedor y Docker quiere tener una forma de evitar el reinicio bucles, si lo matas, realmente quieres matarlo.

Encontré los siguientes enlaces valiosos que muestran el mismo comportamiento en diferentes versiones (por lo que no es un error sino el comportamiento esperado):

Miguel AC
fuente