前言 / 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 BuildBuildKit
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"]

注意事項與最佳實踐

⚠️ 重要提醒

  1. 僅限 Build 階段:Cache mount 只在 build 時有效,運行時不會保留
  2. 需要 BuildKit:必須啟用 Docker BuildKit 才能使用
  3. 路徑一致性:確保緩存路徑與應用程式期望的路徑一致

✅ 最佳實踐

  1. 合理選擇緩存路徑

    # 推薦:使用標準緩存路徑
    RUN --mount=type=cache,target=/root/.cache/pip \
        pip install -r requirements.txt
    
  2. 避免過度緩存

    # 不推薦:緩存整個應用目錄
    RUN --mount=type=cache,target=/app \
        ./build.sh
    
  3. 定期清理緩存

    # 清理 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 正是這樣的工具!