Container que cai na hora ou entra em loop de restart e um problema classico. Aqui vao as tecnicas que uso para descobrir o que esta acontecendo sem ficar no escuro.
O primeiro passo e sempre ver os logs. Parece obvio, mas muita gente pula essa etapa:
docker logs meu-container
docker logs --tail 50 -f meu-container
O --tail 50 mostra as ultimas 50 linhas. O -f segue os logs em tempo real, igual um tail -f.
Se o container nem chega a iniciar, use docker run com --rm para ver o erro sem acumular containers mortos:
docker run --rm minha-imagem
O erro aparece no terminal e o container e removido automaticamente. Nao precisa de docker rm depois.
Para containers que vivem pouco mas o suficiente para inspecionar, use docker start -a:
docker start -ai meu-container
O -a anexa o terminal ao stdout, o -i mantem o stdin aberto.
Quando o container entra em loop de restart, descubra o motivo com docker inspect:
docker inspect meu-container --format '{{.State.ExitCode}}'
docker inspect meu-container | grep -A 5 '"State"'
O exit code diz muito: 0 e sucesso, 1 e erro generico, 137 e SIGKILL (geralmente OOM), 139 e segfault.
Para containers que sobem mas nao respondem como esperado, entre neles para investigar:
docker exec -it meu-container sh
docker exec -it meu-container bash
Se o container nao tem shell, use algo como:
docker cp meu-container:/app/logs .
Isso copia arquivos do container para o host sem precisar de shell.
Outra tecnica util e substituir o CMD original por um comando que mantem o container vivo:
docker run --entrypoint sh minha-imagem -c "sleep 3600"
Agora o container fica rodando por uma hora e voce pode usar docker exec para explorar, testar comandos e ver o que falta.
Para debug de rede, instale ferramentas basicas dentro do container:
docker exec -it meu-container sh
apk add curl busybox-extras
ping google.com
curl http://servico-interno:8080/health
Se o container sobe e morre em milissegundos, use uma abordagem com entrypoint temporario:
docker run -d --name meu-debug minha-imagem sleep infinity
docker exec -it meu-debug sh
O container fica vivo, voce investiga, e depois remove com docker rm -f.
Uma dica final: sempre que um container quebrar, capture o estado completo antes de recriar ele:
docker logs meu-container > logs.txt 2>&1
docker inspect meu-container > inspect.json
docker cp meu-container:/app . 2>/dev/null
Isso preserva a cena do crime para analise.
That's all for now.
Thanks for reading!
Top comments (0)