multi-stage-dockerfile

multi-stage-dockerfile

熱門

為任何語言或框架建立最佳化的多階段 Dockerfile

3.6萬星標
4464分支
更新於 2026/7/1
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 指令為應用程式類型設定適當的健康檢查