PauloRB.dev

Desenvolvedor de Software

Como liberar espaço em disco no WSL2 com Docker no Windows | PauloRB.dev Como liberar espaço em disco no WSL2 com Docker no Windows – PauloRB.dev
Como liberar espaço em disco no WSL2 com Docker no Windows

Como liberar espaço em disco no WSL2 com Docker no Windows

A ordem é: primeiro limpar o Docker, depois compactar o VHDX

O ext4.vhdx é o disco virtual do WSL. Ele cresce conforme você usa, mas não encolhe sozinho quando você apaga coisas dentro do WSL. Por isso, mesmo que você rode docker system prune e libere 80GB, o arquivo .vhdx no Windows continua com o mesmo tamanho. O diskpart + compact vdisk é o que devolve esse espaço pro Windows.

Se você rodar o compact vdisk antes de limpar o Docker, ele não vai liberar quase nada, porque o espaço ainda está ocupado de verdade.

Passo 1 — Limpar o Docker dentro do WSL

Olhando seus números: 57.92GB recuperáveis em imagens + 30.06GB em build cache. Tem quase 90GB pra recuperar aí.

bash# Remove build cache (os 30GB)
docker builder prune -a -f

# Remove imagens não usadas por nenhum container (os ~58GB)
docker image prune -a -f

# Remove containers parados
docker container prune -f

# Remove volumes órfãos (cuidado, veja abaixo)
docker volume prune -f

Atenção com volume prune: ele remove volumes que não estão anexados a nenhum container. Se você tem um volume com dados do banco do proseleta e o container está parado no momento, esse volume vai junto. Antes de rodar, confere:

Se tiver algum volume importante (tipo proseleta_mysql_data ou similar), pula o volume prune e remove só os que você sabe que são lixo:

docker volume rm nome_do_volume

Atalho que faz tudo de uma vez (menos volumes):

Depois confere quanto sobrou:

Passo 2 — Compactar o VHDX no Windows

Agora sim, no PowerShell do Windows como Administrador (não no WSL):

Espera uns 10 segundos pra garantir que o WSL desligou de verdade. Depois:

Vai abrir o prompt do diskpart. Antes de mais nada, você precisa achar o caminho real do seu ext4.vhdx. Aquele {seuUsuario} e {caminho_unico_por_maquina} são placeholders.

Abra o Explorer do Windows e navegue até:

C:\Users\<SeuUsuárioWindows>\AppData\Local\Packages\

Procure uma pasta que começa com CanonicalGroupLimited.Ubuntu... (o nome completo varia, algo tipo CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc). Dentro dela, vá em LocalState\ e confirme que tem o arquivo ext4.vhdx. Copia o caminho completo.

Se você usa Docker Desktop com o backend WSL2, o disco que cresce mais é geralmente o do Docker, não o do Ubuntu. Ele fica em:

C:\Users\<SeuUsuário>\AppData\Local\Docker\wsl\disk\docker_data.vhdx

ou em versões mais novas:

C:\Users\<SeuUsuário>\AppData\Local\Docker\wsl\data\ext4.vhdx

Vale compactar os dois.

De volta ao diskpart, com o caminho em mãos:

select vdisk file="C:\Users\paulo\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

O attach vdisk readonly é importante — sem ele, o compact vdisk em versões mais recentes do Windows reclama. Algumas versões funcionam sem, mas com o readonly funciona sempre.

Pra compactar o disco do Docker, sai do diskpart, repete o wsl --shutdown (por garantia) e roda de novo com o outro caminho.

Alternativa mais simples: Optimize-VHD

Se você tem Windows Pro/Enterprise com Hyper-V habilitado, dá pra fazer tudo em uma linha no PowerShell admin:

wsl --shutdown
Optimize-VHD -Path "C:\Users\paulo\AppData\Local\Docker\wsl\disk\docker_data.vhdx" -Mode Full

No Windows Home não funciona porque não tem o módulo Hyper-V.

Verificando o resultado

Antes de começar, anota o tamanho atual do .vhdx (botão direito → propriedades). Depois de compactar, confere de novo. Você deveria ver uma redução considerável — provavelmente algo entre 60 e 80 GB no seu caso, dado o que o docker system df mostrou.

Se a compactação não reduzir muito, geralmente é porque (1) o Docker não foi limpo antes, ou (2) o WSL não foi totalmente desligado e o .vhdx ainda estava em uso. Roda wsl --list --running no PowerShell pra confirmar que nada está rodando antes do compact.

Mais Posts

Alternar entre múltiplas versões no PHP

Alternar entre múltiplas versões no PHP

Então problemas do dia-a-dia se por alguma motivo qualquer você prefere utilizar ambientes de desenvolvimento locais ao invés de containers... Leia mais

De jQuery para Alpine.js: Um Guia Prático com Laravel e Componentes Reutilizáveis

De jQuery para Alpine.js: Um Guia Prático com Laravel e Componentes Reutilizáveis

Se você vem do jQuery e quer modernizar seus projetos com Alpine.js, esse tutorial é pra você. Vamos mostrar como... Leia mais

Código python para rodar arquivos .sql no postgres

Código python para rodar arquivos .sql no postgres

Nesta semana o Postgres vem me desafiando, e meu pc também, porque por algum motivo o PGADMIN está demorando uma... Leia mais

Olá! Mundo…(mais um blog de um programador no ar)

Olá! Mundo…(mais um blog de um programador no ar)

Como todo mundo na programação já passou por este clichê, aqui não poderia ser diferente então o primeiro post desse... Leia mais