Docker Desktop WSL ext4.vhdx 太大

K S*_*t X 163 docker windows-subsystem-for-linux wsl-2

我安装了 WSL 以及 Docker Desktop。

\n

我尝试通过运行来尽可能多地清理docker

\n
docker system prune -a\n\ndocker volume rm $(docker volume ls -q -f dangling=true)\n
Run Code Online (Sandbox Code Playgroud)\n

然后我验证了

\n
\xe2\x9d\xaf docker system df\nTYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE\nImages          0         0         0B        0B\nContainers      0         0         0B        0B\nLocal Volumes   0         0         0B        0B\nBuild Cache     0         0         0B        0B\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我看到我还有近 12G 被 WSL 使用。

\n

我假设这个文件与 docker 相关。尽管我移除了所有容器和卷,但为什么它仍然如此大?

\n

如何缩小它(或者我可以删除它吗?)

\n

在此输入图像描述

\n

Scr*_*eCy 159

(2022 年 12 月更新)

diskpart现在,如果您通过删除任何不必要的文件释放了虚拟硬盘 (vhdx) 文件中的空间,则现在可以使用Windows 实用程序来收缩虚拟硬盘 (vhdx) 文件。我在本指南中找到了信息

我将下面的说明要点仅供参考,但上面的指南更完整。

首先,通过打开管理员命令窗口并键入以下内容,确保关闭所有 WSL 实例:

>> wsl --shutdown 
Run Code Online (Sandbox Code Playgroud)

验证一切都已停止:

>> wsl.exe --list --verbose
Run Code Online (Sandbox Code Playgroud)

然后启动diskpart:

>> diskpart
Run Code Online (Sandbox Code Playgroud)

和里面的diskpart类型:

DISKPART> select vdisk file="<path to vhdx file>"
Run Code Online (Sandbox Code Playgroud)

例如:

DISKPART> select vdisk file="C:\Users\user\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_12rqwer1sdgsda\LocalState\ext4.vhdx"
Run Code Online (Sandbox Code Playgroud)

它应该回应说 DiskPart successfully selected the virtual disk file.

然后缩小

DISKPART> compact vdisk
Run Code Online (Sandbox Code Playgroud)

此后,vhdx 文件的使用量应该会减少。就我而言,它从 40GB 增加到 4GB。您可以键入exit退出diskpart。

  • 我认为缩小 10 倍是不太可能的,对我来说,我能够将 55GB 减少到 48GB。 (2认同)

Zag*_*ags 144

如果您愿意擦除所有 Docker 数据,请打开 Docker Desktop 客户端,单击标题栏中的错误图标,然后单击Clean / Purge data

清理/清除数据


来源:清理 WSL2 中的 Docker 磁盘空间

  • 还需要检查相关复选框,例如“WSL 2”。这对我有用,并将 ext4.vhdx 使用的磁盘空间从 15GB 减少到 1GB。 (11认同)
  • 它为我节省了超过 100GB!谢谢 (5认同)

Not*_*1ds 72

2023 年 9 月更新:据报道,新的 WSL 预发行版 (2.0.0) 为磁盘映像提供了新的“稀疏”模式,该模式将在删除文件时自动缩小映像。

虽然我还没有亲自测试过这一点,但从DevBlog 公告来看,您可以使用 PowerShell 中的以下命令将现有磁盘映像转换为稀疏磁盘映像:

wsl --manage <distro> --set-sparse true
Run Code Online (Sandbox Code Playgroud)

您还可以将以下内容添加到您的.wslconfig(位于 Windows配置文件目录中,而不是在 WSL 中)以使任何新创建的发行版映像变得稀疏:

[experimental]
sparseVhd=true
Run Code Online (Sandbox Code Playgroud)

较旧的答案

对于“已发布”和早期版本的 WSL 仍然有用

简短回答:

  • diskpart或者Optimize-VHD可以使用命令行开关来收缩虚拟磁盘。 Optimize-VHD通常是首选,但仅在 Windows Pro 或更高版本下可用。详情请参阅下文。

更多细节:

作为参考,有一个关于此主题的开放 Github问题。

WSL2 虚拟磁盘是“动态”.vhdx的,这意味着它们:

  • 分配给最大大小
  • 仅使用几千字节的结构数据进行初始化
  • 随着数据的添加动态增长,直至达到最大分配大小
  • 更重要的是——当数据被删除时,它们不会自动缩小

但是,当然可以手动优化它们。

步骤 0:对于正在阅读本文的其他人,请按照 OP 的指导,首先使用正常的 Docker 命令清理 Docker 数据。

接下来,在所有情况下:

  • 停止 Docker 桌面
  • wsl --shutdown从 PowerShell 或 CMD

由于您已经删除了所有数据(容器、图像、卷),因此您可以完全删除图像:

  • 卸载 Docker 桌面

  • 来自 PowerShell:

    wsl -l -v
    # If they still exist, remove via ...
    wsl --unregister docker-desktop
    wsl --unregister docker-desktop-data
    
    Run Code Online (Sandbox Code Playgroud)

    重要提示:请注意,这些都是破坏性操作,因此请确保您确实不需要 Docker Desktop 中的任何数据。

  • 重新安装 Docker 桌面

对于那些需要保留数据但仍需要回收一些空间的人:

  • 复制ext.vhdx作为备份。请注意,有报告称使用以下任一技术时会出现损坏。

然后,正如该 Github 问题中的评论所述:

  • 在 Windows Pro 上,您可以启用 Hyper-V 功能,然后Optimize-VHD根据原始 Github 问题在 PowerShell 中运行 cmdlet:

    Optimize-VHD -Path .\ext4.vhdx -Mode full
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果使用 Windows Home,则需要diskpart根据此注释使用 use 。

  • 重新启动 Docker Desktop 并确认其正常运行并且所有预期数据都完好无损,然后再删除备份的ext4.vhdx.


小智 9

(2023 年 10 月更新)

  • 停止所有 docker 服务和 WSL:
wsl --shutdown
Run Code Online (Sandbox Code Playgroud)
  • 使用管理员权限打开 PowerShell
  • 运行下一个命令进行 VHDX 压缩:
Optimize-VHD -Path "${Env:LocalAppData}\Docker\wsl\data\ext4.vhdx" -Mode Full
Run Code Online (Sandbox Code Playgroud)

此命令使用 Optimize-VHD 工具来压缩 VHDX 文件。完成此命令后,您可以再次启动 Docker 和 WSL 2。

  • 利润