Mastering Docker Build Cache: Speed Up Your Builds with Cache Mounts

前言 / 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 會直接使用緩存的套件,跳過下載步驟。 ...

August 24, 2025 · 3 min · 471 words · Daniel Ho

Optimizing uv Docker Builds: Advanced Techniques

前言 / Introduction 在使用 uv container 開發 Python 專案時,可以透過一些技巧優化 build 時間與最終 image 的大小。 本篇將介紹三種常用方式:Intermediate Layers、Non-editable Installs、臨時使用 uv。 1. 利用 Intermediate Layers 提升 Build 速度 專案本身會頻繁變動,但依賴通常較穩定,可以將依賴安裝分離成獨立 Docker layer: FROM python:3.12-slim COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /app RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --locked --no-install-project ADD . /app RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --locked Note: --no-install-workspace:排除 workspace 成員 --no-install-package <name>:排除特定套件 pyproject.toml 必須複製進 image,以識別專案根目錄和名稱 2. 非編輯模式安裝(Non-editable Installs) 使用 –no-editable 可以只安裝虛擬環境,減少最終 image 大小: ...

August 24, 2025 · 1 min · 177 words · Daniel Ho

Using uv With Container

前言 / Introduction 如果你也像我一樣,平時喜歡建構 Docker 的 container 並使用 uv 進行 Python 專案開發,那你一定不能錯過 uv 的官方 Image。 這篇文章將帶你了解如何快速上手,並示範一些實用的應用方式。 官方 Docker Image 官方提供了 uv 的 container 版本,你可以直接使用官方 Image 來快速建立開發環境: docker pull ghcr.io/astral-sh/uv:0.8.13 你也可以在 Dockerfile 中直接使用: FROM ghcr.io/astral-sh/uv:0.8.13 WORKDIR /app COPY . /app # 安裝依賴 RUN uv install # 啟動專案 CMD ["uv", "run"] 在 Container 中使用 uv 的好處 環境一致性:無論是在開發、測試還是生產環境,都可以保證專案運行一致。 快速部署:只需要拉取官方 Image,就可以立即開始開發,省去環境配置時間。 便於 CI/CD:在 CI/CD 流程中使用 uv container,可以統一 build、test、deploy 流程。 易於擴展:可以在 Docker Compose 中搭配其他服務,例如 PostgreSQL、Redis 等,輕鬆組建完整開發環境。 避免採坑:官方 container 已經幫你處理了 uv 的環境變數和依賴設定。 範例:快速啟動 Python 專案 建立專案資料夾並進入: mkdir my-uv-project cd my-uv-project 啟動 uv container: docker run -it --rm -v $(pwd):/app -w /app ghcr.io/astral-sh/uv:0.8.13 uv init 建立虛擬環境並安裝依賴: docker run -it --rm -v $(pwd):/app -w /app ghcr.io/astral-sh/uv:0.8.13 uv install 運行專案: docker run -it --rm -v $(pwd):/app -w /app ghcr.io/astral-sh/uv:0.8.13 uv run 這樣就可以在完全隔離的 container 環境中開發和測試你的 Python 專案。 ...

August 24, 2025 · 1 min · 152 words · Daniel Ho

Docker Environment Variables: 4 Simple Ways to Manage Configs

前言 / Introduction When you’re working with Docker for development or deployment, environment variables are essential. But let’s be real — it’s easy to get confused. Does .env work for both build and run? Why doesn’t my variable show up in the container? Where should I put secrets? This post is a personal cheat sheet of the 4 main ways I manage env vars in Docker. Hopefully, it’ll help you too 🙌 ...

May 15, 2025 · 2 min · 383 words · Daniel Ho

Docker Watch: Live Reloading for Fast Dev

前言 / Introduction If you’re tired of rebuilding Docker images every time you change a file — it’s time to watch. 如果你跟我一樣,總是在開發的過程中,深陷 rebuild 的迴圈中,那一定要試試 — Watch 。 What’s --watch, and Why Should I Care? In Docker Compose v2.24+, you can now use --watch to: Detect file changes Rebuild or sync files automatically Avoid restarting manually every. single. time. It’s like having a mini hot-reload system for your containers — perfect for fast iteration. ...

May 15, 2025 · 2 min · 409 words · Daniel Ho