Como funciona o trabalho de política “restart: always” no docker-compose?

9

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 restart: always policy parece não funcionar quando eu mato o contêiner (simulando a falha do aplicativo usando docker kill ) e o docker-compose não reinicia meu contêiner, mesmo que o código de saída seja 137 . Eu observo o mesmo comportamento quando uso a política restart: on-failure . As versões 2 e 3 do docker-compose se comportam da mesma maneira. Meu sistema é Ubuntu Server 16.04 x64.

Minhas perguntas são:

  1. Por que o docker-compose não reinicia o contêiner que caiu (morto)?
  2. Como verificar se a política de reinicialização funciona?
por Marcin Zablocki 22.11.2017 / 21:19

1 resposta

9

Quando você usa o docker kill, esse é o comportamento esperado, pois o Docker não reinicia o contêiner: "Se você parar 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. tentativa de impedir um loop de reinicialização " (referência)

Se você usar o docker stop ou o docker kill, estará parando manualmente o contêiner. Você pode fazer alguns testes sobre políticas de reinicialização: reiniciando o daemon do docker, reiniciando seu servidor, usando um CMD dentro de um contêiner e executando 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 o docker ps -a, ele permanece:

[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 inicia novamente, o que é a documentação, portanto, o docker kill não é a maneira como você deve testar a diretiva de reinicialização, pois supostamente parou o contêiner e o Docker deseja ter um caminho para evitar o reinício de loops, se você o matar, você realmente quer matá-lo.

Eu achei os links a seguir valiosos que mostram o mesmo comportamento em diferentes versões (por isso não é um bug, mas o comportamento esperado):

por 23.11.2017 / 11:07