删除后Docker图像占用空间

u4dcyp6a  于 2023-01-16  发布在  Docker
关注(0)|答案(8)|浏览(101)

我提交了一个现有的Docker容器来创建一个新的映像,但是提交的映像太大了(原始映像是3+ GB,容器中只安装了一些附加的东西,提交的映像是8+GB)。
我的空间不足,所以我决定删除提交的映像,但即使删除提交的映像,我的磁盘空间也没有增加。然而,当我运行docker system df时,它只显示了原始映像和容器应该使用的空间(我只有一个映像和一个容器)。
有什么方法可以让我释放我确定仍被我删除的图像占用的空间吗?(作为参考,我创建了图像,然后删除了它,所有这些都在一个小时内完成,并不断地监视我的可用空间,所以我很确定是这个图像而不是其他东西占用了空间。
此外,我使用的是集成了WSL2的Windows Docker桌面,所以通过/var/lib/docker检查磁盘使用情况并不容易。

zwghvu4y

zwghvu4y1#

我已经使用这些命令将桌面映像从35 GB缩减到1GB
(in windows 10,Docker版本19.03.13)

删除未使用的图像和其他资源

docker system prune -a

删除更多资源

docker volume rm $(docker volume ls -q -f dangling=true)

停止Docker桌面,优化图像

确保HyperV已打开
%windir%\System32\mmc.exe "%windir%\System32\virtmgmt.msc"或在成功搜索中键入Hyper-V
在GUI中优化磁盘〉转到虚拟机并检查磁盘
Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full

启动Docker桌面

现在我有34 GB以上的可用磁盘空间

使用Docker桌面应用程序进行清理

单击标题中的错误图标,然后单击清除/清除数据,即可清除数据。

“清理/清除数据”选项不会删除wsl集成。

gzjq41n4

gzjq41n42#

如果尝试执行Optimize-VHD时出现错误:

Optimize-VHD : The term 'optimize-vhd' is not recognized as the name of a cmdlet

您可以改用diskpart

wsl --shutdown
diskpart
select vdisk file="C:\Users\{YourUser}\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
rlcwz9us

rlcwz9us3#

此代码可用作提升的PowerShell会话的快速修复。我必须使用 pwsh,因为它可以在没有临时文件的情况下与 diskpart 一起正常工作。

docker system prune -a --volumes
net stop com.docker.service
taskkill /IM "docker.exe" /F
taskkill /IM "Docker Desktop.exe" /F
wsl --shutdown
((@"
select vdisk file="%LOCALAPPDATA%\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
"@
)|diskpart)
net start com.docker.service
. "C:\Program Files\Docker\Docker\Docker Desktop.exe"
dgtucam1

dgtucam14#

因为你是在windows上运行docker for desktop,所以你实际上是在虚拟机上运行docker。然后这取决于磁盘映像大小设置为什么,通常虚拟磁盘会扩展以填充该空间。
你可以缩小一个磁盘映像虽然:

  • 停止Docker桌面
  • 打开管理powershell终端
  • 运行Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full,其中path是Docker桌面设置〉资源〉高级〉磁盘映像位置中记录的路径。
  • 启动Docker桌面

这将缩小Docker虚拟机。

xdnvmnnf

xdnvmnnf5#

我使用以下步骤清洁Docker空间。
1.在Windows命令提示符下执行了“Docker System Prune -f”(它说释放45 GB。然而,我能够看到6 GB)。
1.已打开Docker桌面应用程序。
1.导航至“故障排除”菜单并点击“清理/清除数据”按钮。
请注意,这将清除Docker中的所有数据。

uplii1fm

uplii1fm6#

如果您在Windows上使用Docker Desktop,backend Hyper-V和NOT wsl 2(以管理员身份在PowerShell中运行):

docker system prune -a -f
net stop com.docker.service
taskkill /F /IM "Docker Desktop.exe"
taskkill /F /IM "docker.exe"
Stop-VM -VMName "DockerDesktopVM" -Force # or -TurnOff but process may be stuck
Optimize-VHD -Path "C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx" -Mode Full
net start com.docker.service
Start-Process -FilePath "C:\Program Files\Docker\Docker\Docker Desktop.exe" -Verb RunAs

我的PowerShell脚本DockerDesktopVM_cleanup.ps1每3天运行一次,Windows Task Scheduler在本地服务器上(windows 10 x64 ltsc 1809)。

# Run powershell with Admin privileges 
param([switch]$Elevated)

function RunAsAdmin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
function Get-VM-PID-By-GUID($GUID){
    return (Get-CimInstance Win32_Process -Filter "name ='vmwp.exe'" | Where-Object {$_.CommandLine  -Like "*"+$GUID+"*"} | select-object ProcessId -ErrorAction Stop).ProcessId
}

if ((RunAsAdmin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}
'running with full privileges'

docker system prune -a -f
net stop com.docker.service
taskkill /F /IM "docker.exe"
taskkill /F /IM "Docker Desktop.exe"
# update Access Control List for vm file  
$ACL = Get-ACL -Path "C:\Docker\DockerDesktop\DockerDesktop.vhdx"
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("<PUT-YOUR-ROLE>","FullControl","Allow")
$ACL.SetAccessRule($AccessRule)
$ACL | Set-Acl -Path "C:\Docker\DockerDesktop\DockerDesktop.vhdx"
(Get-ACL -Path "C:\Docker\DockerDesktop\DockerDesktop.vhdx").Access | Format-Table IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -AutoSize

# WARNING process may be stuck with this command: Stop-VM -VMName "DockerDesktopVM" -Force/-TurnOff 
$VMGUID = (Get-VM "DockerDesktopVM").VMId.Guid
$VMPID = Get-VM-PID-By-GUID -GUID $VMGUID
Stop-Process ($VMPID) –Force
Optimize-VHD -Path "C:\Docker\DockerDesktop\DockerDesktop.vhdx" -Mode Full
#Start-VM -VMName "DockerDesktopVM" is not needed Docker will be able to start itself
# resume docker
net start com.docker.service
Start-Process -FilePath "C:\Program Files\Docker\Docker\Docker Desktop.exe" -Verb RunAs
4xrmg8kj

4xrmg8kj7#

我在使用非常大的docker buildx缓存时遇到了这种情况,由于filter参数是currently broken,所以我不想删除所有缓存

PS> docker run -it --rm ubuntu:18.04 df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         252G  249G    0G 100% /
tmpfs            64M     0   64M   0% /dev
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sdd        252G  249G    0G 100% /etc/hosts < this is the device we have to expand
  • 记下哪个设备已满。这是您以后必须调整大小的磁盘。*

使用diskpart扩展虚拟磁盘

WSL2下,按照Microsoft关于扩展虚拟磁盘大小的说明,这应该允许您扩展data/isocache挂载。
如果您和我一样,将Docker vhdxAppData/Packages中移出,但未在Docker Desktop GUI中列出,您可以在设置中找到它:

PS> cat $env:APPDATA\Docker\settings.json | Select-String dataFolder
  
    "dataFolder": "D:\\DockerDesktop",

wsl/data目录下找到ext4.vhdx文件(不是DockerDesktop.vhdx!)使用diskpart扩展磁盘。

DISKPART> select vdisk file="D:\DockerDesktop\wsl\data\ext4.vhdx"

DiskPart successfully selected the virtual disk file.

DISKPART> detail vdisk

Device type ID: 0 (Unknown)
Vendor ID: {00000000-0000-0000-0000-000000000000} (Unknown)
State: Added
Virtual size:  256 GB
Physical size:  252 GB
Filename: D:\DockerDesktop\wsl\data\ext4.vhdx
Is Child: No
Parent Filename:
Associated disk#: Not found.

要扩展到512 GB,请输入大小(MB)(512000)并退出diskpart

DISKPART> expand vdisk maximum=512000
DISKPART> exit

在WSL中展开

为了允许Docker使用额外的空间,启动您的WSL 2发行版。您不需要为此使用Docker(这是我个人有点困惑的地方)

PS> wsl
user@WSL2:/mnt/c/Users/user$ sudo mount -t devtmpfs none /dev
user@WSL2:/mnt/c/Users/user$ mount | grep ext4

/dev/sdb on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
/dev/sdd on /mnt/wsl/docker-desktop-data/isocache type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)

isocache位于/dev/sdd上(与之前的已满磁盘匹配)。使用以sizetype为后缀的新大小运行resize2fs

sudo resize2fs /dev/<DEVICE> 512000M

检查您是否有更多空间!

docker run -it --rm ubuntu:18.04 df -h

Filesystem      Size  Used Avail Use% Mounted on
overlay         492G  249G  220G  54% /
tmpfs            64M     0   64M   0% /dev
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sdd        492G  249G  220G  54% /etc/hosts
lhcgjxsq

lhcgjxsq8#

如果您看到"拒绝访问",即使您以"管理员"权限启动powershell。这可能意味着您的当前用户不是管理员。例如,如果您使用Microsoft帐户,则您的本地管理员是另一个用户。因此,您需要将您的当前会话用户添加到vhdx文件权限-"完全控制"。此外,您可以在此处找到如何修复vhdx访问相关问题的方法:https://stackoverflow.com/a/73070459/5966911
然后,您可以启动命令,没有任何问题(但首先备份vhdx):
优化-VHD-路径C:\程序数据\坞站桌面\虚拟机数据\坞站桌面. vhdx-完全模式
此外,在您需要正常停止"Docker Descktop"之前(即任何虚拟机都不应在Taskmanager中运行或挂起,如vmwp.exe)
请参见此处的起源:删除后Docker图像占用空间
如果Optimze-VHD或compact命令对您不起作用,并且您的virgual磁盘包含linux文件系统,您可以通过df看到该磁盘的可用空间(可用空间)。因此,您可能需要在压缩之前将空白空间清零(优化-VHD或压缩)。要进行零位调整,可以使用不同的方法。例如,在Docker的任何容器内使用此命令(风险自担)(因为默认情况下,容器与Docker主机系统动态共享磁盘大小):

dd if=/dev/zero of=zerofillfile bs=1M

在出现错误消息后,运行以下命令:

rm zerofilefile

http://www.netreliant.com/news/8/17/Compacting-VirtualBox-Disk-Images-Linux-Guests.html
或者从这里开始:https://www.altaro.com/hyper-v/compact-vhdx-linux-filesystem/或也适用于我从这里:https://stackoverflow.com/a/60450188/5966911
归零后,您可以使用Optimize-VHD或diskpart应用工具https://stackoverflow.com/a/60450188/5966911重复此"练习

相关问题