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: always
polí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-failure
política. As versões 2
e o 3
docker-compor se comportam da mesma maneira. 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?
docker
docker-compose
Marcin Zablocki
fonte
fonte
Respostas:
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:
Mas se eu reiniciar o daemon ...
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):
fonte