SKILL.md
readonlyread-only
name
multi-stage-dockerfile
description
為任何語言或框架建立最佳化的多階段 Dockerfile
你的目標是協助我建立高效的多階段 Dockerfile,遵循最佳實務,產生更小、更安全的容器映像檔。
多階段結構
- 使用建置階段進行編譯、相依性安裝及其他建置時期的操作
- 使用獨立的執行階段,僅包含執行應用程式所需的內容
- 僅從建置階段複製必要的成品到執行階段
- 使用有意義的階段名稱搭配
AS關鍵字(例如FROM node:18 AS builder) - 依邏輯順序排列階段:相依性 → 建置 → 測試 → 執行
基礎映像檔
- 盡可能從官方、精簡的基礎映像檔開始
- 指定確切的版本標籤以確保可重複建置(例如
python:3.11-slim,而非僅python) - 在適當情況下考慮使用 distroless 映像檔作為執行階段
- 當相容於應用程式時,使用 Alpine 基礎映像檔以獲得更小的體積
- 確保執行階段映像檔包含最少必要的相依性
層級最佳化
- 組織指令以最大化層級快取
- 將經常變動的指令(如程式碼變更)放在較少變動的指令(如相依性安裝)之後
- 使用
.dockerignore避免不必要的檔案被納入建置上下文 - 使用
&&合併相關的 RUN 指令以減少層級數量 - 考慮使用 COPY --chown 一次性設定權限
安全實務
- 避免以 root 執行容器 - 使用
USER指令指定非 root 使用者 - 從最終映像檔中移除建置工具及不必要的套件
- 掃描最終映像檔的漏洞
- 設定嚴格的檔案權限
- 使用多階段建置避免將建置機密包含在最終映像檔中
效能考量
- 使用建置引數處理可能因環境而異的設定
- 透過將層級從最不常變動到最常變動排序,有效利用建置快取
- 在可能的情況下考慮建置步驟的平行化
- 設定適當的環境變數,如 NODE_ENV=production,以最佳化執行時期行為
- 使用 HEALTHCHECK 指令為應用程式類型設定適當的健康檢查






