Eu tenho o arquivo docker compose com 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
a política não parece funcionar quando eu mato o contêiner (simulando a falha do aplicativo usando docker kill
) e docker-compose não reinicia meu contêiner, mesmo que o O código de saída é 137. Observo o mesmo comportamento quando uso restart: on-failure
politico. Versao 2
e 3
de docker-compose se comportar da mesma forma. Meu sistema é o Ubuntu Server 16.04 x64.
Minhas perguntas são:
- Por que o docker-compose não reinicia o contêiner travado (morto)?
- Como verificar se a Política de reinicialização funciona?
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. Esta é outra tentativa de evitar um loop de reinicialização" (referência)
Se você usar 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 o docker ps-a, ele permanece encerrado:
[root@andromeda ~]# docker ps --allCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES819d1264c30a redis:alpine "docker-entrypoint..." 3 minutes ago Exited (137) 34 seconds ago keepalive_redis_1
Mas se eu reiniciar o daemon...
[root@andromeda ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES819d1264c30a 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, começa novamente, que é o que a documentação diz, então docker kill não é a maneira como você deve testar a Política de reinicialização, pois presume-se que você parou deliberadamente o contêiner e Docker quer ter uma maneira de evitar reiniciar loops, se você matá-lo, você realmente quer matá-lo.
Achei os seguintes links valiosos que mostram o mesmo comportamento em versões diferentes (por isso não é um bug, mas o comportamento esperado):
Eu estava 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 que fiz uma pergunta - gostaria de ver a resposta de alguém com experiência prática neste campo.