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 deseja que os contêineres em execução dependam do estado do shell, como fazem com arquivos up service_name
. O único caso de uso é executá-lo a partir de algum tipo de servidor de integração/entrega contínua.
Mas essa forma 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, quanto à versão 1.7.1
, ela é mutuamente exclusiva com -d
:
--abort-on-container-exit Stops all containers if any container was stopped. *Incompatible with -d.*
docker-compose ps -q <service_name>
exibirá o ID do contêiner, independentemente de estar em execução ou não, desde que tenha sido criado.docker ps
mostra apenas aqueles que estão realmente em execução.Vamos combinar esses dois comandos:
docker ps
mostra a versão curta dos IDs por padrão, portanto, precisamos especificar o--no-trunc
sinalizador.ATUALIZAÇÃO : lançou um aviso de "uso do grep" se o serviço não estava em execução. Graças a @Dzhuneyt, aqui está a resposta atualizada.
Quanto à versão
1.7.1
, não existem tais comandos integrados.Em vez disso, o
exec
pode ser usado de maneira semelhante.Quando você executá-lo para o serviço que possui alguns contêineres, ele será executado ok:
Mas quando você o executa para o serviço que não possui contêineres de serviço em execução , ele mostra um erro:
Assim, pode ser usado para verificar se há contêineres "vivos" para determinado serviço.
Para ver todos os serviços em execução:
Para ver se o seu serviço está em execução:
Observe que
--filter
deve ser usado com--services
por algum motivo estranho.Você pode correr:
E você obterá o id do contêiner se
service-name
estiver em execução. Algo como:Se o serviço não estiver em execução, a saída estará vazia, portanto, se você quiser usar isso em um script, poderá fazer algo como:
Eu tinha uma necessidade semelhante. No entanto, eu tenho um
restart: always
em meu ambiente. Portanto, pode ser um pouco complicado detectar se algo está travando e reiniciando em um loop.Fiz uma verificação do Icinga/Nagios para comparar também os horários de criação e início. Talvez seja útil para alguém no futuro:
Que tal agora?
você lista os processos, seleciona as linhas em que "Up" está na coluna 4 e filtra por uma correspondência no nome do serviço.
Aqui está um forro simples que retorna o status atual do serviço:
Isso está retornando apenas o status do contêiner docker. Se você deseja verificar o estado real do seu aplicativo, adicione HEALTHCHECK ao seu Dockerfile ( https://docs.docker.com/engine/reference/builder/#healthcheck ). Depois, você pode inspecioná-lo com:
Se você assumir este cenário:
você pode verificar se existe algum container parado 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:
O
dotenv_check.js
edotenv_check.php
são scripts que saem com um código de erro caso uma variável env necessária esteja ausente.O
set -e
comando informa ao script para parar em caso de erro, o que, por sua vez, interromperá imediatamente o contêiner. Sobre set-eAqui está um one-liner simplificado com base na resposta do almquista:
Usamos o
-q
sinalizador do grep para que um código de saída diferente de zero indique que o serviço não está em execução. Por exemplo:Você pode grep para que
(healthy)
as(unhealthy)
imagens funcionem corretamente.Neste exemplo, estou testando o docker-compose a cada 5 segundos para executar o serviço com
(healthy)
status. Se o script encontrar esse serviço, ele interromperá a execução. Se o script exceder 300 segundos, ele sairá com o código de erro.