前言 / Introduction
為什麼需要 Docker Cache Mount?
在 Docker 開發過程中,你是否遇到過這些困擾?
- 重複下載依賴:每次 build 都要重新安裝相同的套件
- 漫長的等待時間:大型專案的 build 時間動輒 10-20 分鐘
- 網路資源浪費:重複下載相同的檔案
- 開發效率低下:頻繁的 build 測試嚴重影響開發節奏
Docker BuildKit Cache Mount 就是解決這些問題的終極方案!
什麼是 Docker Cache Mount?
核心概念
Cache Mount 是 Docker BuildKit 提供的高級功能,它允許你:
- 緩存依賴目錄:將套件、編譯結果等暫存起來
- 跨 Build 重用:下次 build 時直接使用緩存
- 大幅提升速度:減少重複下載和編譯時間
- 節省網路資源:避免重複傳輸相同檔案
工作原理
第一次 Build → 下載依賴 → 安裝套件 → 緩存到指定目錄
↓
第二次 Build → 檢查緩存 → 直接使用 → 跳過下載步驟
↓
結果:Build 時間從 15 分鐘縮短到 2 分鐘!
基本語法與用法
語法格式
RUN --mount=type=cache,target=<緩存路徑> \
<你的安裝命令>
參數說明
| 參數 | 說明 | 範例 |
|---|---|---|
type=cache | 指定緩存類型 | --mount=type=cache |
target | 緩存目標路徑 | target=/root/.cache/pip |
id | 緩存標識符 | id=my-cache |
sharing | 共享策略 | sharing=locked |
實戰範例:常見使用場景
1. Python pip 緩存
# 基本用法
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# 進階用法:指定緩存 ID
RUN --mount=type=cache,target=/root/.cache/pip,id=pip-cache \
pip install -r requirements.txt
效果:第二次 build 時,pip 會直接使用緩存的套件,跳過下載步驟。
2. Node.js npm 緩存
# npm 緩存
RUN --mount=type=cache,target=/root/.npm \
npm install
# yarn 緩存
RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
yarn install
3. 系統套件 apt 緩存
RUN --mount=type=cache,target=/var/cache/apt \
apt-get update && apt-get install -y \
git \
curl \
build-essential
4. 自訂編譯緩存
# 編譯結果緩存
RUN --mount=type=cache,target=/app/build-cache \
./build-script.sh
# 下載檔案緩存
RUN --mount=type=cache,target=/tmp/downloads \
wget https://example.com/large-file.zip
進階技巧
1. 緩存共享策略
# 獨佔緩存(適合單一 build)
RUN --mount=type=cache,target=/root/.cache/pip,sharing=locked \
pip install -r requirements.txt
# 共享緩存(適合並行 build)
RUN --mount=type=cache,target=/root/.cache/pip,sharing=shared \
pip install -r requirements.txt
2. 多階段 Build 緩存
# 第一階段:安裝依賴
FROM python:3.12-slim AS deps
WORKDIR /app
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# 第二階段:運行環境
FROM python:3.12-slim
WORKDIR /app
COPY --from=deps /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY . .
CMD ["python", "main.py"]
啟用 BuildKit
啟用方法
# 方法 1:臨時啟用
DOCKER_BUILDKIT=1 docker build -t myimage .
# 方法 2:永久啟用(Linux/macOS)
export DOCKER_BUILDKIT=1
# 方法 3:Docker Compose
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
為什麼選擇 BuildKit?
| 功能 | 傳統 Docker Build | BuildKit |
|---|---|---|
| Cache Mount | ❌ 不支援 | ✅ 完整支援 |
| 並行處理 | ❌ 順序執行 | ✅ 並行執行 |
| 快取效率 | ❌ 層級快取 | ✅ 細粒度快取 |
| 錯誤訊息 | ❌ 基本訊息 | ✅ 詳細診斷 |
| CI/CD 整合 | ❌ 有限支援 | ✅ 完整支援 |
完整實作範例
範例 1:Python 專案
# syntax=docker/dockerfile:1.4
FROM python:3.12-slim
WORKDIR /app
# 複製依賴檔案
COPY requirements.txt .
# 使用 cache mount 安裝依賴
RUN --mount=type=cache,target=/root/.cache/pip \
pip install --no-cache-dir -r requirements.txt
# 複製應用程式碼
COPY . .
# 啟動應用
CMD ["python", "main.py"]
範例 2:Node.js 專案
# syntax=docker/dockerfile:1.4
FROM node:18-alpine
WORKDIR /app
# 複製 package 檔案
COPY package*.json ./
# 使用 cache mount 安裝依賴
RUN --mount=type=cache,target=/root/.npm \
npm ci --only=production
# 複製應用程式碼
COPY . .
# 啟動應用
CMD ["npm", "start"]
注意事項與最佳實踐
⚠️ 重要提醒
- 僅限 Build 階段:Cache mount 只在 build 時有效,運行時不會保留
- 需要 BuildKit:必須啟用 Docker BuildKit 才能使用
- 路徑一致性:確保緩存路徑與應用程式期望的路徑一致
✅ 最佳實踐
合理選擇緩存路徑
# 推薦:使用標準緩存路徑 RUN --mount=type=cache,target=/root/.cache/pip \ pip install -r requirements.txt避免過度緩存
# 不推薦:緩存整個應用目錄 RUN --mount=type=cache,target=/app \ ./build.sh定期清理緩存
# 清理 Docker 系統 docker system prune -a
相關資源
總結
Docker Cache Mount 是提升 Docker build 效能的強大工具:
核心價值
- 大幅縮短 build 時間:重複 build 可節省時間
- 節省網路資源:避免重複下載相同檔案
- 提升開發效率:快速迭代和測試
適用場景
- 大型專案開發
- CI/CD 流程優化
- 頻繁的 build 測試
- 網路環境受限的場景
開始使用
現在就開始在你的專案中使用 Cache Mount:
# 啟用 BuildKit
export DOCKER_BUILDKIT=1
# 使用 cache mount 建構
docker build -t myapp .
記住:最好的優化是那些能讓你專注於開發本身,而不是等待 build 完成的優化。Cache Mount 正是這樣的工具!