Como a política “restart: always” funciona na composição do docker?

23

Eu tenho o docker para compor o arquivo com o PostgreSQL e meu aplicativo, assim:

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"

O problema é que a restart: alwayspolítica parece não funcionar quando eu mato o contêiner (simulando uma falha do aplicativo usando docker kill) e o docker-compose não reinicia o meu contêiner, mesmo que o código de saída seja 137 . Observo o mesmo comportamento quando uso a restart: on-failurepolítica. As versões 2e o 3docker-compor se comportam da mesma maneira. Meu sistema é o Ubuntu Server 16.04 x64.

Minhas perguntas são:

  1. Por que o docker-compose não reinicia o contêiner travado (morto)?
  2. Como verificar se a política de reinicialização funciona?
Marcin Zablocki
fonte
1
Estive lá muitas vezes, mas como você pode ver, a documentação não é robusta e não há explicação de como esse recurso funciona, por isso fiz uma pergunta - eu gostaria de receber respostas de alguém com experiência prática nesse campo.
Marcin Zablocki

Respostas:

20

Quando você usa o docker kill, este é o comportamento esperado, pois o Docker não reinicia o contêiner: "Se você interromper manualmente um contêiner, sua política de reinicialização será ignorada até que o daemon do Docker seja reiniciado ou o contêiner seja reiniciado manualmente. Essa é outra tentativa de impedir um loop de reinicialização " (referência)

Se você usa docker stop ou docker kill, você está parando manualmente o contêiner. Você pode fazer alguns testes sobre políticas de reinicialização: reiniciar o daemon do docker, reiniciar o servidor, usar um CMD dentro de um contêiner e executar uma saída ...

Por exemplo, se eu matar meu contêiner implantado com uma política de reinicialização, vejo que ele saiu com o código 137, mas não foi reiniciado de acordo com a janela de encaixe ps -a, ele permanece encerrado:

[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

Mas se eu reiniciar o daemon ...

[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

O contêiner que foi definido com a política de reinicialização é iniciado novamente, como diz a documentação. Portanto, o docker kill não é o modo de testar a política de reinicialização, pois supõe-se que você tenha parado deliberadamente o contêiner e o Docker deseja ter uma maneira de impedir a reinicialização loops, se você matá-lo, você realmente quer matá-lo.

Encontrei valiosos links a seguir que mostram o mesmo comportamento em versões diferentes (portanto, não é um bug, mas o comportamento esperado):

Miguel AC
fonte