i18n/de/skills/optimize-docker-build-cache/SKILL.md
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.
npx skillsauth add pjt222/agent-almanac optimize-docker-build-cacheInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Docker-Buildzeiten durch effektives Layer-Caching und Build-Optimierung reduzieren.
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.
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.
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.
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.
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.
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:
--mount=type=cache fuer persistente Paket-CachesErwartet: 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.
# 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.
.dockerignore schliesst unnoetige Dateien aus.dockerignore vergessen: Grosse Build-Kontexte verlangsamen jeden Build.RUN-, COPY-, ADD-Befehl erstellt einen Layer. Wo sinnvoll kombinieren.&& rm -rf /var/lib/apt/lists/* beenden.create-r-dockerfile - Initiale Dockerfile-Erstellungsetup-docker-compose - Compose-Build-Konfigurationcontainerize-mcp-server - Optimierungen auf MCP-Server-Builds anwendentesting
Launch all available agents in parallel waves for open-ended hypothesis generation on problems where the correct domain is unknown. Use when facing a cross-domain problem with no clear starting point, when single-agent approaches have stalled, or when diverse perspectives are more valuable than deep expertise. Produces a ranked hypothesis set with convergence analysis and adversarial refinement.
tools
Write integration tests for a Node.js CLI application using the built-in node:test module. Covers the exec helper pattern, output assertions, filesystem state verification, cleanup hooks, JSON output parsing, error case testing, and state restoration after destructive tests. Use when adding tests to an existing CLI, testing a new command, verifying adapter behavior across frameworks, or setting up CI for a CLI tool.
development
Screen a proposed trademark for conflicts and distinctiveness before filing. Covers trademark database searches (TMview, WIPO Global Brand Database, USPTO TESS), distinctiveness analysis using the Abercrombie spectrum, likelihood of confusion assessment using DuPont factors and EUIPO relative grounds, common law rights evaluation, and goods/services overlap analysis. Produces a conflict report with a risk matrix. Use before adopting a new brand name, logo, or slogan — distinct from patent prior art search, which uses different databases, legal frameworks, and analysis methods.
tools
Scaffold a new CLI command using Commander.js with options, action handler, three output modes (human-readable, quiet, JSON), and optional ceremony variant. Covers command naming, option design, shared context patterns, error handling, and integration testing. Use when adding a command to an existing Commander.js CLI, designing a new CLI tool from scratch, or standardizing command structure across a multi-command CLI.