はじめに

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で不要なファイルを除外
  • 最小イメージにはscratchdistrolessを使用

まとめ

マルチステージビルドは、本番環境向けDockerイメージの作成に不可欠です。