Docker image 大小優化筆記

Suifeng0214 Lv3

Docker image 的大小對於持續整合/持續部署(CI/CD)流水線的效率、傳輸和存儲成本以及部署速度都有著重要的影響。
有許多技巧可以幫助優化 Docker image 的大小:

多階段構建 (Multi-Stage Build)

多階段構建 是一種在同一個 Dockerfile 中使用多個階段的方式。
這個方法可以讓你在構建階段使用包含構建工具的重型映像檔,而在最終的生產階段只保留必要的可執行文件或構建產物。

具體優點:

  • 分離構建和運行環境
    你可以使用較大的映像檔來進行構建(比如帶有編譯工具的完整 Node.js 或 Java 環境),並在最終的生產環境中使用最小的映像檔(如 alpine 或 slim 版)。
  • 只保留必要文件
    構建完成後,只需將必要的文件(如編譯後的二進制文件、HTML、CSS 或 JS 文件)從構建階段複製到生產階段,避免了包含不必要的中間文件、編譯器和開發依賴。

選擇輕量級映像檔

如:

  • alpine
  • slim
  • Scratch

.dockerignore

類似 .gitignore 的效果。
通常不需要在映像檔中包含的文件:

node_modules
*.log
.git
Dockerfile
README.md

多個命令合併成一個步驟

每一個 Dockerfile 的指令都會創建一層(layer),這些層構成了 Docker 映像檔。
因此,將多個操作合併到一個步驟中可以減少生成的層數,減少映像檔大小。

例如,這樣的構建方式:

1
2
3
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get clean

可以合併成一行來減少映像檔大小:

1
RUN apt-get update && apt-get install -y build-essential && apt-get clean

選擇正確的套件管理工具

有些套件管理工具(如 pnpm)在處理依賴時更加節省空間。相較於 npm 或 yarn,pnpm 使用硬連結來管理依賴,可以減少空間佔用。這些工具對於減少映像檔大小特別有幫助。

清理套件管理器暫存

使用 apt-get 安裝套件後,應該清理暫存:

1
2
RUN apt-get update && apt-get install -y [package-name] \
&& rm -rf /var/lib/apt/lists/*