MCP HubMCP Hub
Вернуться к навыкам

optimize-docker-build-cache

pjt222
Обновлено 2 days ago
6 просмотров
17
2
17
Посмотреть на GitHub
Метаdesign

О программе

Этот навык оптимизирует сборку Docker за счет реализации кэширования слоев, многоступенчатых сборок и функций BuildKit для сокращения времени сборки и размера образов. Он предназначен для проектов на R, Node.js и Python, где повторные установки зависимостей или большие образы замедляют разработку. Используйте его, когда изменения в коде вызывают полные пересборки или когда CI/CD-пайплайны становятся узкими местами.

Быстрая установка

Claude Code

Рекомендуется
Основной
npx skills add pjt222/agent-almanac -a claude-code
Команда плагинаАльтернативный
/plugin add https://github.com/pjt222/agent-almanac
Git клонированиеАльтернативный
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/optimize-docker-build-cache

Скопируйте и вставьте эту команду в Claude Code для установки этого навыка

Документация

優化 Docker 構建快取

以層快取、多階段構建與構建優化,減 Docker 構建時間。

適用時機

  • Docker 構建因重複套件安裝而慢
  • 每次代碼變即重新安裝所有依賴
  • 鏡像大小不必要地大
  • CI/CD 管道構建為瓶頸

輸入

  • 必要:欲優化之既有 Dockerfile
  • 選擇性:目標構建時間之改進
  • 選擇性:目標鏡像大小之減少

步驟

步驟一:依變更頻率排序層

最少變更之層置於最先:

# 1. Base image (rarely changes)
FROM rocker/r-ver:4.5.0

# 2. System dependencies (change occasionally)
RUN apt-get update && apt-get install -y \
    libcurl4-openssl-dev \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# 3. Dependency files only (change when deps change)
COPY renv.lock renv.lock
COPY renv/activate.R renv/activate.R
RUN R -e "renv::restore()"

# 4. Source code (changes frequently)
COPY . .

關鍵原則:Docker 對每層快取。一層變則所有後續層重建。依賴安裝當在源碼複製之前。

預期: Dockerfile 之層由最少變更(基礎鏡像、系統依賴)至最多變更(源碼)排序,依賴鎖檔於完整源之前複製。

失敗時: 若構建仍每次代碼變重新安裝依賴,驗 COPY . . 在依賴安裝之 RUN 命令之後,非之前。

步驟二:分依賴安裝與代碼

(每次代碼變重建套件):

COPY . .
RUN R -e "renv::restore()"

(但於鎖檔變時重建套件):

COPY renv.lock renv.lock
RUN R -e "renv::restore()"
COPY . .

Node.js 同模式:

COPY package.json package-lock.json ./
RUN npm ci
COPY . .

預期: 依賴鎖檔(renv.lockpackage-lock.jsonrequirements.txt)於完整源碼 COPY . . 之前以獨立層複製並安裝。

失敗時: 若鎖檔複製敗,確檔存於構建上下文中,且未被 .dockerignore 排除。

步驟三:用多階段構建

分構建依賴與運行時:

# Build stage - includes dev tools
FROM rocker/r-ver:4.5.0 AS builder
RUN apt-get update && apt-get install -y \
    libcurl4-openssl-dev libssl-dev build-essential
COPY renv.lock .
RUN R -e "install.packages('renv'); renv::restore()"

# Runtime stage - minimal image
FROM rocker/r-ver:4.5.0
RUN apt-get update && apt-get install -y \
    libcurl4 libssl3 \
    && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/lib/R/site-library /usr/local/lib/R/site-library
COPY . /app
WORKDIR /app
CMD ["Rscript", "main.R"]

預期: Dockerfile 有附開發工具之 builder 階段與但有生產依賴之運行時階段。終鏡像顯小於單階段構建。

失敗時:COPY --from=builder 找不到函式庫,驗安裝路徑於諸階段間相符。用 docker build --target builder . 獨立除錯構建階段。

步驟四:合併 RUN 命令

RUN 創一層。合併相關命令:

(3 層,apt 快取留存):

RUN apt-get update
RUN apt-get install -y curl git
RUN rm -rf /var/lib/apt/lists/*

(1 層,清快取):

RUN apt-get update && apt-get install -y \
    curl \
    git \
    && rm -rf /var/lib/apt/lists/*

預期: 相關 apt-get 或套件安裝命令合於單一 RUN 指令,每以快取清理(rm -rf /var/lib/apt/lists/*)作結。

失敗時: 若合併之 RUN 命令於中途敗,暫拆之以辨失敗命令,修後再合。

步驟五:用 .dockerignore

防不必要之檔入構建上下文:

.git
.Rproj.user
.Rhistory
.RData
renv/library
renv/cache
node_modules
docs/
*.tar.gz
.env

預期: 專案根存 .dockerignore 檔,排除 .gitnode_modulesrenv/library、構建產物與環境檔。構建上下文大小顯小。

失敗時: 若容器中缺所需檔,查 .dockerignore 中過廣之模式。用 docker build 詳細輸出驗何檔送至守護程序。

步驟六:啟 BuildKit

DOCKER_BUILDKIT=1 docker build -t myimage .

或於 docker-compose.yml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile

連同 COMPOSE_DOCKER_CLI_BUILD=1DOCKER_BUILDKIT=1 之環境變數。

BuildKit 啟用:

  • 平行階段構建
  • 更佳之快取管理
  • --mount=type=cache 以持久套件快取

預期: 構建以 BuildKit 啟用運行(由 #1 [internal] load build definition 風之輸出示之)。多階段構建可並行則並行。

失敗時: 若 BuildKit 未啟,驗構建命令前已匯出環境變數。舊版 Docker,升級 Docker Engine 至 18.09+ 以支援 BuildKit。

步驟七:為套件管理器用快取掛載

# R packages with persistent cache
RUN --mount=type=cache,target=/usr/local/lib/R/site-library \
    R -e "install.packages('dplyr')"

# npm with persistent cache
RUN --mount=type=cache,target=/root/.npm \
    npm ci

預期: 後續構建自掛載重用快取套件,縱層失效亦顯減安裝時間。快取跨構建持久。

失敗時:--mount=type=cache 不被識,確 BuildKit 已啟(DOCKER_BUILDKIT=1)。語法需 BuildKit,舊式構建器不支援。

驗證

  • 但代碼變後之重建顯快
  • 鎖檔未變時依賴安裝層被快取
  • .dockerignore 排除不必要之檔
  • 鏡像大小較未優化構建減少
  • 多階段構建(若用)分構建與運行時依賴

常見陷阱

  • 裝依賴前複製所有檔:每次代碼變即使依賴快取失效
  • .dockerignore:大構建上下文減慢每次構建
  • 層過多:每 RUNCOPYADD 創一層。合理處合併之
  • 不清 apt 快取:apt-get 安裝恆以 && rm -rf /var/lib/apt/lists/* 作結
  • 平台特定快取:快取層為平台特定。CI runner 或不能受益於本地快取

相關技能

  • create-r-dockerfile - 初始 Dockerfile 創建
  • setup-docker-compose - compose 構建配置
  • containerize-mcp-server - 對 MCP server 構建施優化

GitHub репозиторий

pjt222/agent-almanac
Путь: i18n/wenyan-lite/skills/optimize-docker-build-cache
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Похожие навыки

content-collections

Мета

Этот навык предоставляет проверенную в продакшене настройку для Content Collections — TypeScript-ориентированного инструмента, который преобразует файлы Markdown/MDX в типобезопасные коллекции данных с валидацией Zod. Используйте его при создании блогов, сайтов документации или контентных приложений на Vite + React для обеспечения типобезопасности и автоматической проверки содержимого. Он охватывает всё: от настройки плагина Vite и компиляции MDX до оптимизации развертывания и валидации схем.

Просмотреть навык

polymarket

Мета

Этот навык позволяет разработчикам создавать приложения на платформе прогнозных рынков Polymarket, включая интеграцию с API для торговли и получения рыночных данных. Он также обеспечивает потоковую передачу данных в реальном времени через WebSocket для отслеживания текущих сделок и рыночной активности. Используйте его для реализации торговых стратегий или создания инструментов, обрабатывающих обновления рынка в реальном времени.

Просмотреть навык

creating-opencode-plugins

Мета

Этот навык помогает разработчикам создавать плагины OpenCode, которые подключаются к более чем 25 типам событий, таким как команды, файлы и операции LSP. Он предоставляет структуру плагина, спецификации API событий и шаблоны реализации для модулей на JavaScript/TypeScript. Используйте его, когда вам нужно перехватывать, отслеживать или расширять жизненный цикл ассистента OpenCode AI с помощью пользовательской событийно-ориентированной логики.

Просмотреть навык

sglang

Мета

SGLang — это высокопроизводительный фреймворк для обслуживания больших языковых моделей (LLM), специализирующийся на быстрой структурированной генерации JSON, regex и рабочих процессов агентов с использованием кэширования префиксов RadixAttention. Он обеспечивает значительно более высокую скорость вывода, особенно для задач с повторяющимися префиксами, что делает его идеальным для сложных структурированных результатов и многократных диалогов. Выбирайте SGLang вместо альтернатив, таких как vLLM, когда вам требуется ограниченное декодирование или вы создаете приложения с интенсивным совместным использованием префиксов.

Просмотреть навык