返回技能列表

optimize-docker-build-cache

pjt222
更新于 2 days ago
7 次查看
17
2
17
在 GitHub 上查看
design

关于

This Claude Skill optimizes Docker build times using layer caching, multi-stage builds, BuildKit features, and dependency-first copy patterns for R, Node.js, and Python projects. Use it when your Docker builds are slow due to repeated dependency installations, unnecessary large image sizes, or when CI/CD pipeline builds become a bottleneck. It helps structure your Dockerfile to maximize cache efficiency and reduce rebuild times.

快速安装

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 中复制并粘贴此命令以安装该技能

技能文档


name: optimize-docker-build-cache description: > Optimiere Docker-Buildzeiten durch Layer-Caching, Multi-Stage-Builds, BuildKit-Funktionen und Abhaengigkeiten-zuerst-Kopiermuster. Anwendbar auf R-, Node.js- und Python-Projekte. Verwende diesen Skill, wenn Docker-Builds durch wiederholte Paketinstallationen langsam sind, wenn Rebuilds bei jeder Code-Aenderung alle Abhaengigkeiten neu installieren, wenn Image-Groessen unnoetig gross sind oder wenn CI/CD-Pipeline-Builds einen Engpass darstellen. license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: containerization complexity: intermediate language: Docker tags: docker, cache, optimization, multi-stage, buildkit locale: de source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16

Docker-Build-Cache optimieren

Docker-Buildzeiten durch effektives Layer-Caching und Build-Optimierung reduzieren.

Wann verwenden

  • Docker-Builds sind durch wiederholte Paketinstallationen langsam
  • Rebuilds installieren bei jeder Code-Aenderung alle Abhaengigkeiten neu
  • Image-Groessen sind unnoetig gross
  • CI/CD-Pipeline-Builds sind ein Engpass

Eingaben

  • Erforderlich: Vorhandenes Dockerfile zur Optimierung
  • Optional: Angestrebte Verbesserung der Buildzeit
  • Optional: Angestrebte Reduzierung der Image-Groesse

Vorgehensweise

Schritt 1: Layer nach Aenderungshaeufigkeit ordnen

Am wenigsten aenderbare Layer zuerst platzieren:

# 1. Basisimage (aendert sich selten)
FROM rocker/r-ver:4.5.0

# 2. Systemabhaengigkeiten (aendern sich gelegentlich)
RUN apt-get update && apt-get install -y \
    libcurl4-openssl-dev \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# 3. Nur Abhaengigkeitsdateien (aendern sich bei Deps-Aenderungen)
COPY renv.lock renv.lock
COPY renv/activate.R renv/activate.R
RUN R -e "renv::restore()"

# 4. Quellcode (aendert sich haeufig)
COPY . .

Schluesselprinzip: Docker cached jeden Layer. Wenn sich ein Layer aendert, werden alle nachfolgenden Layer neu gebaut. Die Abhaengigkeitsinstallation sollte vor dem Quellcode-Kopieren kommen.

Erwartet: Die Dockerfile-Layer sind von am wenigsten aenderbar (Basisimage, System-Deps) bis am meisten aenderbar (Quellcode) geordnet, wobei Abhaengigkeits-Lockfiles vor dem vollstaendigen Quellcode kopiert werden.

Bei Fehler: Wenn Builds weiterhin bei jeder Code-Aenderung Abhaengigkeiten neu installieren, sicherstellen, dass COPY . . nach dem Abhaengigkeitsinstallations-RUN-Befehl kommt, nicht davor.

Schritt 2: Abhaengigkeitsinstallation vom Code trennen

Schlecht (baut Pakete bei jeder Code-Aenderung neu):

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

Gut (baut Pakete nur bei Lockfile-Aenderung neu):

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

Gleiches Muster fuer Node.js:

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

Erwartet: Die Abhaengigkeits-Lockfile (renv.lock, package-lock.json, requirements.txt) wird in einem separaten Layer kopiert und installiert, bevor der vollstaendige Quellcode mit COPY . . kopiert wird.

Bei Fehler: Wenn das Kopieren der Lockfile fehlschlaegt, sicherstellen, dass die Datei im Build-Kontext existiert und nicht durch .dockerignore ausgeschlossen wird.

Schritt 3: Multi-Stage-Builds verwenden

Build-Abhaengigkeiten von Laufzeitabhaengigkeiten trennen:

# Build-Phase - enthaelt Entwicklungstools
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()"

# Laufzeit-Phase - minimales 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"]

Erwartet: Das Dockerfile hat eine Builder-Phase mit Entwicklungstools und eine Laufzeit-Phase mit nur Produktionsabhaengigkeiten. Das finale Image ist deutlich kleiner als ein Single-Stage-Build.

Bei Fehler: Wenn COPY --from=builder keine Bibliotheken findet, den Installationspfad zwischen den Phasen abgleichen. docker build --target builder . verwenden, um die Build-Phase unabhaengig zu debuggen.

Schritt 4: RUN-Befehle kombinieren

Jeder RUN-Befehl erstellt einen Layer. Zusammengehoerige Befehle kombinieren:

Schlecht (3 Layer, apt-Cache bleibt bestehen):

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

Gut (1 Layer, bereinigter Cache):

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

Erwartet: Zusammengehoerige apt-get- oder Paketinstallationsbefehle sind in einzelne RUN-Anweisungen kombiniert, die jeweils mit Cache-Bereinigung (rm -rf /var/lib/apt/lists/*) enden.

Bei Fehler: Wenn ein kombinierter RUN-Befehl mittendrin fehlschlaegt, ihn voruebergehend aufteilen, um den fehlerhaften Befehl zu identifizieren, dann nach der Behebung wieder zusammenfuegen.

Schritt 5: .dockerignore verwenden

Unnoetige Dateien am Eintritt in den Build-Kontext hindern:

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

Erwartet: Eine .dockerignore-Datei existiert im Projektstamm, die .git, node_modules, renv/library, Build-Artefakte und Umgebungsdateien ausschliesst. Die Build-Kontext-Groesse ist merklich kleiner.

Bei Fehler: Wenn benoetigte Dateien im Container fehlen, .dockerignore auf zu breite Muster pruefen. Die ausfuehrliche Ausgabe von docker build verwenden, um zu ueberpruefen, welche Dateien an den Daemon gesendet werden.

Schritt 6: BuildKit aktivieren

DOCKER_BUILDKIT=1 docker build -t myimage .

Oder in docker-compose.yml:

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

Mit den Umgebungsvariablen COMPOSE_DOCKER_CLI_BUILD=1 und DOCKER_BUILDKIT=1.

BuildKit ermoeglicht:

  • Parallele Stage-Builds
  • Besseres Cache-Management
  • --mount=type=cache fuer persistente Paket-Caches

Erwartet: Builds werden mit aktiviertem BuildKit ausgefuehrt (erkennbar an der Ausgabe im Stil #1 [internal] load build definition). Multi-Stage-Builds fuehren Stages wo moeglich parallel aus.

Bei Fehler: Wenn BuildKit nicht aktiv ist, sicherstellen, dass die Umgebungsvariablen vor dem Build-Befehl exportiert werden. Bei aelteren Docker-Versionen Docker Engine auf 18.09+ fuer BuildKit-Unterstuetzung aktualisieren.

Schritt 7: Cache-Mounts fuer Paketmanager verwenden

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

# npm mit persistentem Cache
RUN --mount=type=cache,target=/root/.npm \
    npm ci

Erwartet: Nachfolgende Builds verwenden gecachte Pakete aus dem Mount wieder, was die Installationszeiten drastisch reduziert, selbst wenn der Layer invalidiert wird. Der Cache bleibt ueber Builds hinweg bestehen.

Bei Fehler: Wenn --mount=type=cache nicht erkannt wird, sicherstellen, dass BuildKit aktiviert ist (DOCKER_BUILDKIT=1). Die Syntax erfordert BuildKit und wird vom Legacy-Builder nicht unterstuetzt.

Validierung

  • Rebuilds nach reinen Code-Aenderungen sind deutlich schneller
  • Abhaengigkeitsinstallations-Layer wird gecacht, wenn sich die Lockfile nicht geaendert hat
  • .dockerignore schliesst unnoetige Dateien aus
  • Image-Groesse ist im Vergleich zum nicht optimierten Build reduziert
  • Multi-Stage-Build (falls verwendet) trennt Build- und Laufzeitabhaengigkeiten

Haeufige Fehler

  • Alle Dateien vor der Deps-Installation kopieren: Invalidiert den Abhaengigkeits-Cache bei jeder Code-Aenderung.
  • .dockerignore vergessen: Grosse Build-Kontexte verlangsamen jeden Build.
  • Zu viele Layer: Jeder RUN-, COPY-, ADD-Befehl erstellt einen Layer. Wo sinnvoll kombinieren.
  • apt-Cache nicht bereinigen: apt-get-Installationen immer mit && rm -rf /var/lib/apt/lists/* beenden.
  • Plattformspezifische Caches: Cache-Layer sind plattformspezifisch. CI-Runner profitieren moeglicherweise nicht von lokalen Caches.

Verwandte Skills

  • create-r-dockerfile - Initiale Dockerfile-Erstellung
  • setup-docker-compose - Compose-Build-Konfiguration
  • containerize-mcp-server - Optimierungen auf MCP-Server-Builds anwenden

GitHub 仓库

pjt222/agent-almanac
路径: i18n/de/skills/optimize-docker-build-cache
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

content-collections

Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。

查看技能

polymarket

这个Claude Skill为开发者提供完整的Polymarket预测市场开发支持,涵盖API调用、交易执行和市场数据分析。关键特性包括实时WebSocket数据流,可监控实时交易、订单和市场动态。开发者可用它构建预测市场应用、实施交易策略并集成实时市场预测功能。

查看技能

creating-opencode-plugins

该Skill帮助开发者创建OpenCode插件,用于接入命令、文件、LSP等25+种事件。它提供了插件结构、事件API规范和JavaScript/TypeScript实现模式,适合需要拦截操作、扩展功能或自定义事件处理的场景。开发者可通过它快速构建响应式模块来增强OpenCode AI助手的能力。

查看技能

sglang

SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。

查看技能