create-multistage-dockerfile
について
このスキルは、ビルド依存関係を本番イメージから分離し、より小さく安全なコンテナを実現する最適化された多段階Dockerfileを作成します。Go、Rust、Java、Node.js、Python向けの言語固有パターンを提供し、成果物のコンパイル、テスト、最終パッケージングを含みます。本番用Dockerイメージが過大な場合や、ビルドツールを最終実行環境から分離する必要がある場合にご利用ください。
クイックインストール
Claude Code
推奨npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/create-multistage-dockerfileこのコマンドをClaude Codeにコピー&ペーストしてスキルをインストールします
ドキュメント
name: create-multistage-dockerfile locale: es source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16 description: > Crear Dockerfiles multi-etapa que separan las dependencias de compilación de la imagen de producción para obtener imágenes más pequeñas, seguras y eficientes. Cubrir patrones para Go, Rust, Java, Node.js y Python con compilación de artefactos, prueba, y empaquetado final. license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: containerization complexity: intermediate language: multi tags: docker, multi-stage, build, optimization, security
Crear Dockerfile Multi-Etapa
Crear Dockerfiles multi-etapa para separar compilación de producción y obtener imágenes mínimas.
Cuándo Usar
- Las imágenes Docker de producción son demasiado grandes
- Necesitando separar herramientas de compilación de la imagen final
- Compilando binarios estáticos (Go, Rust) para imágenes minimales
- Ejecutando pruebas en la compilación sin incluirlas en producción
- Reduciendo la superficie de ataque eliminando herramientas innecesarias
Entradas
- Requerido: Código fuente de la aplicación
- Requerido: Proceso de compilación del proyecto
- Opcional: Suite de pruebas para ejecutar durante la compilación
- Opcional: Requisitos de imagen base para producción
Procedimiento
Paso 1: Diseñar las Etapas de Compilación
Identificar las etapas necesarias según el lenguaje.
# Patrón general de 3 etapas
# Etapa 1: Dependencias
# Etapa 2: Compilación
# Etapa 3: Producción (imagen final)
Esperado: Separación clara entre etapas de compilación y producción.
En caso de fallo: Comenzar con 2 etapas (compilación + producción) y agregar más si es necesario.
Paso 2: Implementar para Lenguajes Compilados (Go)
# Etapa de compilación
FROM golang:1.21-alpine AS builder
RUN apk add --no-cache git ca-certificates
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /server .
# Etapa de producción
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /server /server
ENTRYPOINT ["/server"]
Para Rust:
FROM rust:1.74-alpine AS builder
WORKDIR /app
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release
COPY src ./src
RUN cargo build --release
FROM alpine:3.18
COPY --from=builder /app/target/release/myapp /usr/local/bin/myapp
CMD ["myapp"]
Esperado: La imagen final contiene solo el binario y dependencias mínimas de runtime.
En caso de fallo: Verificar que el binario es estáticamente enlazado (para scratch), incluir certificados SSL si se necesita HTTPS.
Paso 3: Implementar para Lenguajes Interpretados (Node.js)
# Etapa de dependencias
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production
# Etapa de compilación
FROM node:20-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
# Etapa de producción
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json .
USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]
Esperado: La imagen final no contiene devDependencies, archivos fuente ni herramientas de compilación.
En caso de fallo: Verificar que todos los archivos necesarios se copian desde las etapas correctas, probar la imagen final con todas las funcionalidades.
Paso 4: Agregar Etapa de Pruebas
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
# Etapa de pruebas (no produce imagen, pero falla la compilación si las pruebas fallan)
FROM builder AS tester
RUN npm test
# Etapa de producción (solo se alcanza si las pruebas pasan)
FROM node:20-alpine
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/index.js"]
# Compilar hasta la etapa de pruebas
docker build --target tester -t mi-app:test .
# Compilar imagen de producción (ejecuta pruebas automáticamente)
docker build -t mi-app:latest .
Esperado: Las pruebas se ejecutan durante la compilación, la imagen de producción solo se crea si las pruebas pasan.
En caso de fallo: Usar --target para compilar etapas individuales y depurar problemas.
Validación
- La imagen final es significativamente más pequeña que una compilación de una sola etapa
- No se incluyen herramientas de compilación en la imagen de producción
- Las pruebas se ejecutan durante la compilación
- La aplicación funciona correctamente en la imagen final
- Las capas de caché funcionan eficientemente entre etapas
Errores Comunes
- Copiar demasiado en la etapa final: Solo copiar artefactos necesarios con
COPY --from=. - No separar dependencias de compilación: Las devDependencies no deben estar en la imagen final.
- Olvidar certificados SSL: Las imágenes
scratchno tienen certificados; copiarlos explícitamente. - Caché de dependencias ineficiente: Copiar archivos de bloqueo antes del código fuente en cada etapa.
- No nombrar las etapas: Usar
AS nombrepara referencia clara en lugar de índices numéricos.
Habilidades Relacionadas
create-dockerfile- Patrones base de Dockerfileoptimize-docker-build-cache- Estrategias avanzadas de cachécreate-r-dockerfile- Dockerfiles específicos para R
GitHub リポジトリ
関連スキル
content-collections
メタこのスキルは、Content Collections(Markdown/MDXファイルを型安全なデータコレクションに変換するTypeScriptファーストのツール)の本番環境でテストされた設定を提供します。Zodバリデーションによる型安全性を実現し、ブログ、ドキュメントサイト、コンテンツ重視のVite + Reactアプリケーション構築時にご利用ください。Viteプラグインの設定、MDXコンパイルから、デプロイ最適化、スキーマバリデーションまで、すべてを網羅しています。
polymarket
メタこのスキルは、開発者がPolymarket予測市場プラットフォームを活用したアプリケーション構築を可能にします。API統合による取引や市場データの取得に加え、WebSocketを介したリアルタイムデータストリーミングにより、ライブ取引や市場活動を監視できます。取引戦略の実装や、ライブ市場更新を処理するツールの作成にご利用ください。
creating-opencode-plugins
メタこのスキルは、開発者がコマンド、ファイル、LSP操作など25種類以上のイベントタイプにフックするOpenCodeプラグインを作成することを支援します。JavaScript/TypeScriptモジュール向けに、プラグイン構造、イベントAPI仕様、および実装パターンを提供します。カスタムイベント駆動ロジックでOpenCode AIアシスタントのライフサイクルをインターセプト、監視、または拡張する必要がある場合にご利用ください。
sglang
メタSGLangは、高性能なLLMサービングフレームワークであり、RadixAttentionプレフィックスキャッシュを活用したJSON、正規表現、エージェントワークフロー向けの高速で構造化された生成を特長とします。特にプレフィックスが繰り返されるタスクにおいて、大幅に高速な推論を実現し、複雑な構造化出力やマルチターン対話に最適です。制約付きデコードが必要な場合や、広範なプレフィックス共有を伴うアプリケーションを構築する場合は、vLLMなどの代替案ではなくSGLangを選択してください。
