步驟一:清除 build cache
docker builder prune -a -f
說明:Docker 在建置 image 時,每一層(layer)都會被快取起來,方便下次建置時加速。這些快取久了會越積越多,往往是佔用空間的大宗。
builder prune:清理 build 快取-a:清除所有快取層,不只是「dangling」(懸空、沒被任何 image 引用的)那些-f:force,不用再手動確認一次
步驟二:在 WSL 內部做 trim
wsl -d docker-desktop -- fstrim -av
說明:步驟一只是讓 Docker「認為」空間空出來了,但這些空間在底層的虛擬磁碟(ext4.vhdx)裡,還沒有真正被標記成「可回收」。這一步就是去做這件事。
wsl -d docker-desktop:指定對docker-desktop這個 distro(WSL 裡 Docker 引擎所在的 Linux 環境)下指令-- fstrim -av:在該 distro 內執行fstrim-a:對所有支援 trim 的掛載點都執行(all)-v:verbose,執行完會顯示實際回收了多少空間
作用:把 ext4 檔案系統裡「已刪除但尚未通知底層磁碟」的區塊,真正標記為空閒,讓虛擬磁碟知道這些空間可以被壓縮。
步驟三:完全退出 Docker Desktop
說明:光關閉視窗不夠,因為 Docker Desktop 常駐在系統列(工作列右下角小圖示),背景程序還在跑,會持續佔用/鎖定那個虛擬磁碟檔案。
為什麼需要:只要 Docker Desktop 還在跑,ext4.vhdx 這個檔案就會被佔用鎖定,Windows 沒辦法對它做壓縮處理。
步驟四:關閉整個 WSL
wsl --shutdown
說明:這會關閉電腦上「所有」正在運行的 WSL distro(不只 Docker 的),釋放所有相關的虛擬磁碟檔案鎖。
作用:
- 讓 Windows 完全釋放對
ext4.vhdx的存取 - 較新版本的 Docker Desktop(4.34 以後)在這個時間點會自動偵測並壓縮虛擬磁碟檔案,讓它實際變小
注意:這會關掉你所有的 WSL 環境(例如你也有裝 Ubuntu 的話也會一起關閉),不過重新開啟只要再執行 wsl 或開啟該 distro 即可,不會遺失資料。
步驟五(選用):手動壓縮虛擬磁碟
只有當你做完前面四步、重新打開 Docker Desktop 後,發現硬碟空間還是沒有實際釋放出來時才需要做這一步。
diskpart
select vdisk file="C:\Users\<你的帳號>\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
逐行說明:
diskpart:開啟 Windows 內建的磁碟分割工具(需要以系統管理員身分執行 PowerShell/CMD)select vdisk file="...":選取 Docker 的虛擬磁碟檔案(路徑通常在這裡,但建議先確認你電腦上實際位置)attach vdisk readonly:以唯讀模式掛載這個虛擬磁碟(壓縮作業需要先掛載才能操作)compact vdisk:真正執行壓縮,把前面 fstrim 標記出來的空閒空間從檔案裡「物理性」移除,讓檔案大小變小detach vdisk:卸載exit:離開 diskpart
風險提示:操作前務必確認 Docker Desktop 已完全關閉,且路徑輸入正確;操作虛擬磁碟建議先備份重要 volume 資料,雖然這個流程本身不會刪除資料,但涉及磁碟工具操作,保守起見還是建議留意。
