Eu estou usando o docker-compose
.
Alguns comandos gostam up -d service_name
ou start service_name
estão retornando imediatamente e isso é bastante útil se você não quiser que os contêineres em execução dependam do estado do shell, como fazem com o regular up service_name
. O único caso de uso está sendo executado em algum tipo de servidor de integração / entrega contínuo.
Mas essa maneira de executar / iniciar serviços não fornece nenhum feedback sobre o estado real do serviço posteriormente.
A referência da CLI do Docker Compose para o up
comando menciona a opção relevante, mas, como para a versão 1.7.1
, é mutuamente exclusiva com -d
:
--abort-on-container-exit Stops all containers if any container was stopped. *Incompatible with -d.*
De alguma forma, posso verificar manualmente se o contêiner está realmente funcionando e não parou por causa de algum erro?
fonte
docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q <service_name>)
grep ....
peça terminar com uma string vazia.if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)` ]; then
. O que isso faz é: primeiro verifica se o serviço existe (mesmo se estiver parado) e a segunda parte verifica se o serviço existente está realmente em execução. Você pode incluir isso no seu exemplo para futuros leitores que examinam apenas a resposta aceita. Eu acho que é útil.Quanto à versão
1.7.1
, não existem comandos desse tipo embutidos.Em vez disso, o
exec
pode ser usado de maneira semelhante.Quando você o executa para o serviço que possui alguns contêineres, ele funcionará ok:
Mas quando você executá-lo para o serviço, que não tem em execução de serviços de contentores, ele irá mostrar um erro:
Portanto, ele pode ser usado para verificar se existem contêineres "vivos" para um determinado serviço.
fonte
Você pode correr:
E você receberá o ID do contêiner, se
service-name
estiver em execução. Algo como:Se o serviço não estiver sendo executado, a saída estará vazia; portanto, se você quiser usá-lo em um script, poderá fazer algo como:
fonte
docker-compose up
Ctrl-C.docker-compose ps
deve mostrar que os estados do contêiner não estão "Ativos", masdocker-compose ps -q service-name
ainda fornecem um ID.Eu tive uma necessidade semelhante. No entanto, eu tenho um
restart: always
no meu ambiente. Portanto, pode ser um pouco complicado detectar se algo está travando e reiniciando em um loop.Fiz uma verificação Icinga / Nagios para comparar também os horários de criação e início. Talvez seja útil para alguém na mesma linha:
fonte
Se você assumir este cenário:
você pode verificar se há qualquer recipiente parou devido a um erro com:
docker ps -a | grep 'Exited (255)'
.Essa verificação funciona corretamente, mesmo no caso de contêineres que devem parar imediatamente sem erro (ou seja, contêineres de dados), pois seu status (de
docker ps -a
) é marcado comoExited (0)
.Por exemplo, em nosso docker-compose.yml, iniciamos nossos contêineres com:
command: sh -c 'node dotenv_check.js && pm2 start --no-daemon src/worker.js --watch'
Para php-fpm, usamos um comando semelhante:
Os scripts
dotenv_check.js
edotenv_check.php
são encerrados com um código de erro, caso uma variável env necessária esteja ausente.O
set -e
comando diz ao script para parar por erro, o que, por sua vez, interrompe imediatamente o contêiner. Sobre set-efonte
Que tal agora?
você lista os processos, selecione as linhas em que "Para cima" está na coluna 4 e filtra para obter uma correspondência no nome do serviço.
fonte