Windows下的Docker清理操作

41

我正在使用Windows版的Docker来启动一个MSSQL服务器。除了我的硬盘已经满了之外,一切都很正常。我已经使用了Docker提供的所有清理命令,删除了所有的镜像和容器:

docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q -f dangling=true)
docker rmi $(docker images -q)

这将不会删除c:\ProgramData\Docker\windowsfilter文件夹中的任何内容,那里仍然有很多文件。大约130个G的存储空间,没有运行中的容器或存储的镜像。

Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.24)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      windows/amd64
 Experimental: true

我尝试使用docker-ci-zap (https://github.com/jhowardmsft/docker-ci-zap) ,但是不建议运行该工具,因此我宁愿使用替代方案。


你尝试过使用-f标志(强制)并使用docker volume rm [OPTIONS] VOLUME [VOLUME ...]命令删除卷吗? - dsax7
Jup 也尝试过这个,但它会保留 windowsfilter 文件夹,这似乎是最大的。 - imacbest
请尝试执行 docker system prune - tgogos
我也尝试过了,但没有成功。我可以使用docker-ci-zap工具删除整个C:\programdata\docker文件夹,但这似乎不是正确的答案,因为创建者不建议这样做(?)。 - imacbest
嘿,@imacbest,你找到解决方案了吗? - felixsigl
@felixsigl 没有找到解决方案,目前我只是在磁盘空间不足时使用docker-ci-zap。这种设置并不理想,因为我需要删除所有内容,有时设置会出现问题。希望Windows Docker团队将来能添加一个好的清理功能... - imacbest
11个回答

35

自Docker 1.13(2017年1月)起,Docker新增了一些规范的清理子命令(使用时需谨慎):

然而,Docker桌面版升级过程中有些问题,导致需要手动删除文件或进行"工厂重置"。


请确保在运行这些清理命令后,重新启动 Docker for Windows,否则您将看不到 MobyLinuxVM 大小的任何显着变化。 - Arash
在Windows上,以下脚本可帮助确定哪些windowsfilter子文件夹未使用并可以删除:https://gist.github.com/olljanat/340b4033eb24d8d33ec75f2c3c3b6b3d - sparrowt
6
请确保您尝试在Windows容器模式和Linux容器模式下运行(右键单击Docker托盘图标>“切换到Windows容器...”),否则docker system prune和相关命令将无法清理与Windows容器相关的文件(ProgramData\Docker\windowsfilter)。注意不要改变原意。 - sparrowt
@sparrowt 谢谢,这就是我在寻找的解决方案。 - pascalre

12

从Powershell窗口:

docker system prune -a -f
net stop com.docker.service
taskkill /F /IM "Docker Desktop.exe"
stop-vm DockerDesktopVM
Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full
start-vm DockerDesktopVM
start "C:\Program Files\Docker\Docker\Docker Desktop.exe"
net start com.docker.service

我在导入图像时空间不足,只有docker system prune -a -f清除了我的windowsfilter文件夹。 - Cpt.Whale
1
正如sparrowt所评论的那样:请确保您尝试在Windows容器模式和Linux容器模式下运行(右键单击Docker托盘图标>“切换到Windows容器...”),否则docker system prune等命令将无法清理与Windows容器相关的文件(ProgramData\Docker\windowsfilter)。 - victorm1710

10

ext4.vhdx 文件大约有 40GB,ProgramData/Docker Desktop 文件夹大约有 17GB。如果您在使用 Docker Desktop,可以简单地清理它:

只需打开 Docker Desktop,点击 故障排除,然后选择 清理/清空数据

enter image description here

对我来说很有效。


+1:这真的有效!与“docker system prune”不同,它对堆积在“C:/ProgramData/Docker/windowsfilter”中的Windows容器数据毫不起作用(是的,“切换到Windows容器”已经应用了)。“docker system prune”的可怕形式就像那样默默地失败... - Will

7

只需使用docker systemprune命令,它将像这样清理所有东西

$ docker system prune

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache Are you sure you want to continue? [y/N] y

在 Docker 17.06.1 及更高版本中,您可以为 docker system prune 添加 --volumes 标志以清除未被至少一个容器使用的卷。
有关更多详细信息,请参见https://docs.docker.com/config/pruning/#prune-everything

14
windowsfilter 目录仍会膨胀,使用修剪镜像或系统清理时不会被清理。 - starscream_disco_party
和 @sparrowt 在上面的答案中提到的一样,确保在运行 docker system prune 前切换到 Windows 容器。 - pascalre
你可以通过命令行执行 docker context use desktop-windows 来切换。 - Ryan Pavlik

5

我使用了那个工具,但在同一个问题中有一个警告说该工具可能是危险的,所以我希望可能会有另一种解决方案。https://github.com/moby/moby/issues/26873#issuecomment-249338936 - imacbest

4
我使用 WSL 2,这对我很有帮助:打开 PowerShell 并输入以下命令。
PS C:\tmp> diskpart

Microsoft DiskPart version 10.0.19041.1

Copyright (C) Microsoft Corporation.
On computer: *****

DISKPART> select vdisk file="C:\Users\<UID>\AppData\Local\Docker\wsl\data\ext4.vhdx"

DiskPart successfully selected the virtual disk file.

DISKPART> compact vdisk

  100 percent completed

DiskPart successfully compacted the virtual disk file.

在PowerShell中尝试使用wsl --shutdown,如果它声称另一个进程正在使用此磁盘。
来源:链接

3
我在运行 Windows 容器后遇到了类似的问题。我的 windowsfilter 文件夹大小增加到约 80GB,我无法手动删除这些文件或使用 docker system prune --valume 删除它们。经过多次谷歌搜索,我最终找到了 docker-ci-zap.exe 的解决方案,但这不被推荐。然后我通过阅读https://github.com/docker/for-win/issues/745#issuecomment-444461889发现了一个简单的解决方法。

解决方法是在你想要删除的文件夹名称中添加 -removing 后缀,并重新启动 Docker。这将触发 Docker 在启动时正确清理文件夹。我已经发现 Docker 每次启动最多会清理 10 个文件夹。如果你有超过 10 个文件夹,则可能需要多次重启以删除所有文件夹。

如果你想要摆脱所有文件,请使用以下命令:

Get-ChildItem -Path D:\docker\data\windowsfilter -Directory | % {Rename-Item $_.FullName "$($_.FullName)-removing" -ErrorAction:SilentlyContinue}


我真的希望这个能够工作,但在Docker社区版V18.03.0-ce-win59(16752)上,它并没有删除任何文件夹。 - Daniel
在 Windows 4.6.0 上使用了 Docker。 - Kamil C
对我来说,每次停止服务时,Docker 都会删除超过 10 个文件,经过几次重启后,所有文件都被删除了。 - enwi

2
如果还有关联的话,我遇到了同样的问题。尝试使用以下命令:
docker rmi

在我的情况下问题是我尝试在 Linux 容器模式下执行它。
当我切换到 Windows 容器时,该命令执行会删除此文件夹的所有内容。

1
这解决了我的问题,谢谢。我切换到了 Windows 容器模式并运行了 docker system prune 命令。 - demius

1

2021年解决方案更新

注意:
所有命令都在管理员权限的PowerShell中执行

第一步:清理所有镜像和卷。

docker image ls # These images will be all deleted
docker image prune -a -f

docker volume ls # These volumes will be all deleted
docker volume prune -a -f

docker system prune -a -f

第二步:停止 Docker 服务

右键单击 Docker 图标或使用 taskkill /F /IM "Docker Desktop.exe" 命令。然后执行:net stop com.docker.service

第三步:缩小 .vhdx 文件大小

Optimize-VHD -Path "C:\Users\alessiosavi\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full

现在您可以重新启动Docker服务:net start com.docker.service


1

尝试

icacls "C:\ProgramData\Docker" /T /C /grant Administrators:F 

作为管理员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接