Back to Skills

create-multistage-dockerfile

pjt222
Updated 6 days ago
15 views
17
2
17
View on GitHub
Metaaidesign

About

This Claude Skill generates optimized multi-stage Dockerfiles that separate build and runtime environments to create minimal production images. It helps when your images are too large, contain unnecessary build tools, or need deployment to constrained environments. The skill covers builder/runtime stage separation, artifact copying, and targets like scratch, distroless, and Alpine.

Quick Install

Claude Code

Recommended
Primary
npx skills add pjt222/agent-almanac -a claude-code
Plugin CommandAlternative
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternative
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/create-multistage-dockerfile

Copy and paste this command in Claude Code to install this skill

Documentation

造多段 Dockerfile

構多段 Dockerfile 分構與行境以生最小產像。

  • 產像過大(>500MB 為編譯語)
  • 構具(編、發頭)入終像
  • 自一 Dockerfile 生發與產異像
  • 部於限境(邊、無服)

  • :存 Dockerfile 或待容器化案
  • :語與構系(npm、pip、go build、cargo、maven)
  • :目行基(slim、alpine、distroless、scratch)
  • :終像寸預

一:別構與行依

構段行段
編譯gcc、g++、rustc不需
包理npm、pip、cargo或(解譯語)
發頭-dev不需
源碼全源樹僅編出
試架jest、pytest不需

二:構多段構

核模:構於肥像、複品至瘦像。

# ---- Build Stage ----
FROM <build-image> AS builder
WORKDIR /src
COPY <dependency-manifest> .
RUN <install-dependencies>
COPY . .
RUN <build-command>

# ---- Runtime Stage ----
FROM <runtime-image>
COPY --from=builder /src/<artifact> /<dest>
EXPOSE <port>
CMD [<entrypoint>]

三:施語專模

Node.js(剪 node_modules)

FROM node:22-bookworm AS builder
WORKDIR /src
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

FROM node:22-bookworm-slim
RUN groupadd -r app && useradd -r -g app app
WORKDIR /app
COPY --from=builder /src/dist ./dist
COPY --from=builder /src/node_modules ./node_modules
COPY --from=builder /src/package.json .
USER app
EXPOSE 3000
CMD ["node", "dist/index.js"]

Python(虛境複)

FROM python:3.12-bookworm AS builder
WORKDIR /src
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

FROM python:3.12-slim-bookworm
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
WORKDIR /app
COPY --from=builder /src .
RUN groupadd -r app && useradd -r -g app app
USER app
EXPOSE 8000
CMD ["python", "app.py"]

Go(靜二入 scratch)

FROM golang:1.23-bookworm AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server

FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /server /server
EXPOSE 8080
ENTRYPOINT ["/server"]

Rust(靜 musl 二)

FROM rust:1.82-bookworm AS builder
RUN apt-get update && apt-get install -y musl-tools && rm -rf /var/lib/apt/lists/*
RUN rustup target add x86_64-unknown-linux-musl
WORKDIR /src
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs \
    && cargo build --release --target x86_64-unknown-linux-musl \
    && rm -rf src
COPY . .
RUN touch src/main.rs && cargo build --release --target x86_64-unknown-linux-musl

FROM scratch
COPY --from=builder /src/target/x86_64-unknown-linux-musl/release/myapp /myapp
EXPOSE 8080
ENTRYPOINT ["/myapp"]

得: 終像僅含行與編品。

敗:COPY --from=builder 路。用 docker build --target builder 除構段。

四:擇行基

scratch0 MB靜 Go/Rust 二
gcr.io/distroless/static~2 MB靜二+CA 證
gcr.io/distroless/base~20 MB動二(libc)
*-slim50-150 MB解譯語
alpine~7 MB殼需時

注: Alpine 用 musl libc。某 Python wheels 與 Node native modules 或不行。解譯語宜用 -slim(glibc)。

五:跨段構引

ARG APP_VERSION=0.0.0

FROM golang:1.23 AS builder
ARG APP_VERSION
RUN go build -ldflags="-X main.version=${APP_VERSION}" -o /server .

FROM gcr.io/distroless/static
COPY --from=builder /server /server
ENTRYPOINT ["/server"]

構以:docker build --build-arg APP_VERSION=1.2.3 .

注: FROM 前之 ARG 為全。各段須重申 ARG 以用之。

六:較像寸

# Build both variants
docker build -t myapp:fat --target builder .
docker build -t myapp:slim .

# Compare sizes
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myapp

得: 產像較構段小 50-90%。

  • docker build 諸段畢
  • 終像不含構具(編、發頭)
  • docker run 於瘦像正行
  • 像寸較單段顯減
  • COPY --from=builder 路正
  • 無源漏入產像

  • 缺行庫:編碼或需共庫(libclibssl)。瘦像須全試
  • COPY --from:品路須合。用 docker build --target builderdocker run --rm builder ls /path
  • Alpine musl 問:Native Node.js addons 與某 Python 包於 Alpine 敗。用 -slim
  • 全 ARG 範FROM 前申之 ARG 僅於 FROM 行可。各段用則重申
  • 忘 CA 證scratch 無證。自 builder 複 /etc/ssl/certs/ca-certificates.crt 或用 distroless

  • create-dockerfile - 單段標 Dockerfile
  • create-r-dockerfile - R 專 Dockerfile 用 rocker 像
  • optimize-docker-build-cache - 層快與 BuildKit 特
  • setup-compose-stack - 用多段像之 compose 設

GitHub Repository

pjt222/agent-almanac
Path: i18n/wenyan-ultra/skills/create-multistage-dockerfile
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Related Skills

content-collections

Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill

polymarket

Meta

This skill enables developers to build applications with the Polymarket prediction markets platform, including API integration for trading and market data. It also provides real-time data streaming via WebSocket to monitor live trades and market activity. Use it for implementing trading strategies or creating tools that process live market updates.

View skill

creating-opencode-plugins

Meta

This skill helps developers create OpenCode plugins that hook into 25+ event types like commands, files, and LSP operations. It provides the plugin structure, event API specifications, and implementation patterns for JavaScript/TypeScript modules. Use it when you need to intercept, monitor, or extend the OpenCode AI assistant's lifecycle with custom event-driven logic.

View skill

sglang

Meta

SGLang is a high-performance LLM serving framework that specializes in fast, structured generation for JSON, regex, and agentic workflows using its RadixAttention prefix caching. It delivers significantly faster inference, especially for tasks with repeated prefixes, making it ideal for complex, structured outputs and multi-turn conversations. Choose SGLang over alternatives like vLLM when you need constrained decoding or are building applications with extensive prefix sharing.

View skill