はじめに
Dockerのマルチステージビルドを使用すると、Dockerfile内で複数のFROM文を使用できます。各FROM命令は異なるベースイメージを使用でき、新しいビルドステージを開始します。
前提条件
- Docker インストール済み (バージョン 17.05+)
- Dockerfileの基本的な理解
- サンプルアプリケーション (Goアプリを使用)
ステップ1: シングルステージビルドの問題
Goアプリケーションの典型的なシングルステージDockerfile:
FROM golang:1.21
WORKDIR /app
COPY . .
RUN go build -o myapp .
CMD ["./myapp"]
これではGoツールチェーン全体を含むため、約800MBのイメージになります。
ステップ2: マルチステージビルド
# ビルドステージ
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .
# 本番ステージ
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
結果: イメージサイズが約800MBから約15MBに削減!
ステップ3: ビルドとテスト
docker build -t myapp:multi-stage .
docker images myapp
docker run -p 8080:8080 myapp:multi-stage
ベストプラクティス
.dockerignoreで不要なファイルを除外scratchやdistrolessを使用まとめ
マルチステージビルドは、本番環境向けDockerイメージの作成に不可欠です。