清除Docker快取

步驟一:清除 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 資料,雖然這個流程本身不會刪除資料,但涉及磁碟工具操作,保守起見還是建議留意。