DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to debugar containers que quebram

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Se o container nao tem shell, use algo como:

docker cp meu-container:/app/logs .
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Isso preserva a cena do crime para analise.

That's all for now.
Thanks for reading!

Top comments (0)