Reclaim disk space used by Docker Desktop (WSL2)

Reclaim disk space used by Docker Desktop (WSL2)

Problem

I was always out of disk space in my C drive, and even though I clear my stuff often, I notice that my space is never reclaimed, instead, it kept going down.

I used WizTree to view which file is taking up my disk space, and I noticed this

Notice that in %LOCALAPPDATA%\Docker\wsl\data, there is a file ext4.vhdx that is taking up 64.6gb of space, around 14% of my total disk space.

Docker Desktop for Windows uses WSL2 to manage all images and keep them in ext4.vhdx

So to reclaim the space, I tried to delete the docker images via Docker Desktop manually, but the space was not reclaimed even though I deleted most of the unused images.

Based on portainer, I am currently only using 4.1gb of space where before the clean-up, I am using around 20+gb.

Solution - Optimize-VHD

Hyper-V has a command Optimize-VHD that optimizes the allocation of space used by virtual hard disk files. In short, it helps to shrink the space used by Docker Desktop.

To do so, exit Docker Desktop, and shutdown WSL by running

wsl --shutdown

Give it a minute, and run wsl -l -v and the distro should be in stopped state.

 wsl -l -v
  NAME                    STATE           VERSION
* Ubuntu                  Stopped         2
  docker-desktop          Stopped         2
  docker-desktop-data     Stopped         2
  rancher-desktop         Stopped         2
  rancher-desktop-data    Stopped         2

Navigate to the directory that stores ext4.vhdx, and run the following command

optimize-vhd -Path .\ext4.vhdx -Mode full

Give it some time to complete, it took around 5 min for me.

Viola! It reclaims nearly 40gb of disk space for me.

It's a chore to keep reclaiming manually, but I've learned that WSL has a new update recently where it comes with Sparse VHD, a feature that automatically shrinks the WSL virtual hard disk (VHD) as you use it. If you are already using the latest version of WSL (currently in pre-release as of writing), then you can run the following command to enable it.

# wsl --manage <distro> --set-sparse <true/false>
wsl --manage Ubuntu --set-sparse true

References