Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
create-multistage-dockerfile【部署与运维】ビルド環境とランタイム環境を分離して最小限の本番イメージを作成するマルチステージDockerfileを構築する。 ビルダー/ランタイムステージの分離、成果物のコピー、scratch/distroless/alpineターゲット、 およびサイズ比較をカバーする。本番イメージが大きすぎる場合、ビルドツールが最終イメージに含まれている場合、 1つのDockerfileから開発用と本番用の別々のイメージが必要な場合、またはエッジやサーバーレスなどの 制約のある環境にデプロイする場合に使用する。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
ビルドツールとランタイムを分離して最小限の本番イメージを生成するマルチステージDockerfileを構築する。
| カテゴリ | ビルドステージ | ランタイムステージ |
|---|---|---|
| コンパイラ | 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>]
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"]
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"]
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"]
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を使用してビルドステージをデバッグする。
| ベース | サイズ | シェル | ユースケース |
|---|---|---|---|
scratch | 0 MB | なし | 静的Go/Rustバイナリ |
gcr.io/distroless/static | 約2 MB | なし | 静的バイナリ + CA証明書 |
gcr.io/distroless/base | 約20 MB | なし | 動的バイナリ(libc) |
*-slim | 50-150 MB | あり | インタープリタ言語 |
alpine | 約7 MB | あり | シェルアクセスが必要な場合 |
注意: Alpineはmusl libcを使用する。一部のPythonホイールやNodeネイティブモジュールは動作しない場合がある。インタープリタ言語には-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のパスが正しいlibc、libssl)を必要とする場合がある。スリムイメージを十分にテストするCOPY --fromパスの誤り: 成果物のパスは正確に一致する必要がある。docker build --target builderしてからdocker run --rm builder ls /pathでデバッグする-slimを使用するFROMの前に宣言されたARGはFROM行でのみ利用可能。各ステージ内で再宣言するscratchには証明書がない。ビルダーから/etc/ssl/certs/ca-certificates.crtをコピーするかdistrolessを使用するcreate-dockerfile - シングルステージの汎用Dockerfilecreate-r-dockerfile - rockerイメージを使用するR固有のDockerfileoptimize-docker-build-cache - レイヤーキャッシュとBuildKit機能setup-compose-stack - マルチステージイメージを使用するcompose設定