Skip to content

Instantly share code, notes, and snippets.

@banyudu
Last active April 5, 2024 05:43
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save banyudu/af131c7bb681e8a80b5cbe2047e62d4c to your computer and use it in GitHub Desktop.
Save banyudu/af131c7bb681e8a80b5cbe2047e62d4c to your computer and use it in GitHub Desktop.
WSL2 Docker释放磁盘空间

WSL2 Docker释放磁盘空间

Docker使用久了,会残留很多中间生成的镜像,占用磁盘空间。

要清理Docker镜像,本来是挺简单的,一条命令就搞定了:

docker system prune

但是当在Windows中使用WSL2作为Docker后端引擎的时候,情况就会稍微复杂一些了。

原理

因为WSL2本质上来说是虚拟机,对于每个虚拟机,Windows会创建vhdx后缀的磁盘镜像文件,用于存储其内容,类似于vmdk、vdi,用过虚拟机的同学应该都不陌生。

这种镜像文件的特点是支持自动扩容,但是一般不会自动缩容。因此一旦Docker镜像文件过多,引起镜像扩容,即使再使用docker system prune清理虚拟机中的镜像文件,也不会释放出已经占用的系统磁盘空间了。

解决方案

镜像文件虽然一般不会自动压缩,但是支持手动压缩。

首先寻找到对应的镜像文件,在系统中搜索ext4.vhdx文件,可以搜索到多条记录,Docker对应的镜像文件一般是在C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx这个位置。

找到这个文件之后,进行压缩即可。

首先,删除Docker中的无用镜像:

docker system prune

然后退出Docker Desktop并关停WSL2实例。

wsl --shutdown

最后打开 Windows 中提供的diskpart工具进行压缩

# 代码来自 https://github.com/microsoft/WSL/issues/4699#issuecomment-627133168

diskpart
# open window Diskpart
select vdisk file="C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

根据 L53317评论,上述diskpart系列命令也可简化为:

Optimize-VHD -Path "path_to_disk.vhdx" -Mode Full

如此操作完成之后,就可以看到磁盘空间已经收回了。

yeah!

@zhangmianhongni
Copy link

强大,实测有效,感谢

@jyt13
Copy link

jyt13 commented May 1, 2022

似乎路径双引号内的两个像顿号的上标不应该出现

@banyudu
Copy link
Author

banyudu commented May 1, 2022

似乎路径双引号内的两个像顿号的上标不应该出现

谢谢指正,已修复

@ehahaC
Copy link

ehahaC commented Aug 15, 2022

效果很好,感谢!

@L53317
Copy link

L53317 commented Nov 1, 2022

貌似可以使用
Optimize-VHD -Path "path_to_disk.vhdx" -Mode Full
应该也是有效果的,这个工具只需要一个命令即可。猜测Optimize-VHD这个工具的内部实现是diskpart,因为用diskpart和用Optimize-VHD时都遇到了相同的“文件被加密,用户没有能力解密”的问题,并且实测这两个命令都可以用来解决类似问题。
参考链接:
https://tkacz.pro/reduce-wsl-and-docker-disks-size/
https://learn.microsoft.com/en-us/powershell/module/hyper-v/optimize-vhd?view=windowsserver2022-ps&viewFallbackFrom=win10-ps

@banyudu
Copy link
Author

banyudu commented Nov 2, 2022

貌似可以使用
Optimize-VHD -Path "path_to_disk.vhdx" -Mode Full
应该也是有效果的,这个工具只需要一个命令即可。猜测Optimize-VHD这个工具的内部实现是diskpart,因为用diskpart和用Optimize-VHD时都遇到了相同的“文件被加密,用户没有能力解密”的问题,并且实测这两个命令都可以用来解决类似问题。
参考链接:
https://tkacz.pro/reduce-wsl-and-docker-disks-size/
https://learn.microsoft.com/en-us/powershell/module/hyper-v/optimize-vhd?view=windowsserver2022-ps&viewFallbackFrom=win10-ps

赞👍

为方便更多人看到,我添加在上文中了

@yfdyh000
Copy link

yfdyh000 commented Dec 1, 2022

中间可改为
select vdisk file="%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx"

@zhibisora
Copy link

这样的话就可以更改为

select vdisk file="%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

@nvozno
Copy link

nvozno commented Feb 22, 2023

实测好用 感谢

@aak1247
Copy link

aak1247 commented Jun 30, 2023

Optimize-VHD -Path "%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full

@yfdyh000
Copy link

yfdyh000 commented Sep 4, 2023

管理员权限的PowerShell中:
Optimize-VHD -Path $env:USERPROFILE"\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full

@NSS712
Copy link

NSS712 commented Nov 29, 2023

有效!感谢!

@JasonShao55
Copy link

有用

补充下: compact vdisk 命令出错The requested operation requires that the virtual disk be attached read only.时用detach vdisk再分离一次,然后 compact vdisk

@KnineF
Copy link

KnineF commented Jan 23, 2024

diskpart和optimize都没用,输出都正常,但结束后vhdx的大小完全没变

@banyudu
Copy link
Author

banyudu commented Jan 23, 2024

diskpart和optimize都没用,输出都正常,但结束后vhdx的大小完全没变

有没有提前在 wsl 中执行 docker system prune命令呢?

@rfire-sun
Copy link

有效,感谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment