Docker image 大小優化筆記

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 | RUN apt-get update |
可以合併成一行來減少映像檔大小:
1 | RUN apt-get update && apt-get install -y build-essential && apt-get clean |
選擇正確的套件管理工具
有些套件管理工具(如 pnpm)在處理依賴時更加節省空間。相較於 npm 或 yarn,pnpm 使用硬連結來管理依賴,可以減少空間佔用。這些工具對於減少映像檔大小特別有幫助。
清理套件管理器暫存
使用 apt-get 安裝套件後,應該清理暫存:
1 | RUN apt-get update && apt-get install -y [package-name] \ |