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

Laravel: Trabalhando com whereHas e with de forma simples

Laravel: Trabalhando com whereHas e with de forma simples

Quando trabalhamos com Eloquent no Laravel, frequentemente precisamos realizar consultas baseadas em relacionamentos entre modelos. Para isso, o Laravel oferece... 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

Construir array de texto a partir de um array.

Construir array de texto a partir de um array.

No dia de hoje(17/08/2022) me deparei com o seguinte problema onde recebiamos um array javascript contendo textos e cujas chaves... Leia mais

Adicionar e remover classes CSS com Vanilla Javascript

Adicionar e remover classes CSS com Vanilla Javascript

Adicionar e remover classes CSS com JQUERY é uma atividade muito simples, mas também através do javascript puro conseguimos o... Leia mais