CLI AI

Docker comeu seu disco: como recuperar o espaço

2026-05-13

/var/lib/docker cresce até virar o problema do disco inteiro. A solução é um único comando, mas rodá-lo às cegas é exatamente como as pessoas acabam apagando a imagem base sobre a qual estavam prestes a construir. Primeiro olhe, depois limpe.

1. Veja para onde foi o espaço

clai
$ clai mostra quanto espaço em disco o docker está usando e quanto pode ser recuperado→ docker system dfTYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLEImages          47        13        28.88GB   20GB (69%)Containers      16        9         126.8MB   513.8kB (0%)Local Volumes   38        7         6.311GB   4.084GB (64%)Build Cache     181       0         0B        0B

Leia a coluna RECLAIMABLE antes de qualquer coisa. Aqui as imagens são o problema, os volumes vêm em segundo, os containers são ruído.

2. A limpeza segura

clai
$ clai remove containers parados, imagens órfãs e redes não usadas→ docker system prune

O prune simples leva os containers parados, as imagens órfãs (camadas sem nenhuma tag), redes não usadas e o cache de build. Não toca em imagens com tag nem em volumes. Esse você pode rodar sem pensar duas vezes.

3. A limpeza agressiva

clai
$ clai remove todas as imagens que nenhum container em execução está usando→ docker system prune -a⚠ CAUTION — remove toda imagem não usada por um container em execução

-a amplia "não usada" de sem tag para não usada agora por nenhum container em execução. Sua imagem base de 4 GB, baixada com cuidado, conta como não usada se agora não houver nada rodando — você vai baixá-la de novo no próximo build.

4. Volumes: o espaço que ninguém espera

clai
$ clai lista os volumes do docker que nenhum container está usando→ docker volume ls -qf dangling=true

O prune ignora volumes por padrão, de propósito — é lá que ficam os bancos de dados. Primeiro liste, reconheça os nomes, e só depois decida. docker volume prune apaga dados que, por definição, não têm backup.

5. Só o cache de build

clai
$ clai limpa o cache de build do docker com mais de uma semana→ docker builder prune --filter 'until=168h'

Numa máquina de CI, isso costuma ser o ganho maior e mais seguro. --filter until= deixa você manter as camadas recentes, então o próximo build continua rápido.

6. Para não acontecer de novo

clai
$ clai limita os arquivos de log dos containers docker a 10 megabytes e 3 arquivos→ sudo tee /etc/docker/daemon.json <<'EOF'{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}EOF

Os logs de containers não têm rotação por padrão. Essa é a única configuração que evita o erro mais comum de se repetir. Ela vale para containers criados depois de um restart do daemon.

Pegadinhas

  • prune -a com nada rodando apaga tudo. A definição de "em uso" é um container em execução, não uma imagem que você gosta. Suba seu stack primeiro, ou use --filter 'until=720h' em vez disso.
  • Prune não reduz um disco cheio no Docker Desktop. No macOS e no Windows, a imagem de disco da VM não devolve espaço ao host automaticamente.
  • Um volume apagado não volta. Não existe lixeira. Faça backup antes de limpar volumes, sempre.

Perguntas relacionadas

Qual a diferença entre docker system prune e docker image prune -a? system prune cobre containers, redes, imagens e cache de build de uma vez; image prune -a só remove imagens, mas remove até as com tag.

Por que /var/lib/docker/overlay2 é tão grande? São as camadas de imagens e containers. Não apague nada ali manualmente — os metadados ficam em outro lugar e você vai corromper o armazenamento de imagens. Use o prune.

Dá para ver qual imagem é a maior? docker image ls --format '{{.Size}}\t{{.Repository}}:{{.Tag}}' | sort -rh as ordena.

Veja também

CliAI marca o prune -a como CAUTION e pergunta antes de executar — porque a diferença entre os dois prunes são 20 GB de downloads repetidos. Instale em uma linha.