Tips

ステージ1: ビルドステージ

DockerのMulti-stage buildsは、ビルド時と実行時に必要なファイルを分離することで、最終的なDockerイメージのサイズを大幅に削減できます。これにより、イメージのプルやデプロイが高速化され、セキュリティリスクも低減されます。

Docker

DockerのMulti-stage buildsは、ビルド時と実行時に必要なファイルを分離することで、最終的なDockerイメージのサイズを大幅に削減できます。これにより、イメージのプルやデプロイが高速化され、セキュリティリスクも低減されます。

Docker Multi-stage Buildsでスリムなイメージを作成する アプリケーションのビルドに必要なツールや中間ファイルを含まず、最終的な実行環境のみをパッケージ化することで、Dockerイメージのフットプリントを劇的に小さくする方法です。特にコンパイル言語のアプリケーションで絶大な効果を発揮します。

# ステージ1: ビルドステージ
# Go言語のビルド環境を用意
FROM golang:1.20-alpine AS builder

# ワーキングディレクトリを設定
WORKDIR /app

# 依存関係をダウンロード(キャッシュを効かせるため先にコピー)
COPY go.mod go.sum ./
RUN go mod download

# ソースコードをコピー
COPY . .

# アプリケーションをビルド
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .

# ステージ2: 最終的な実行ステージ
# 最小限のランタイム環境を用意
FROM alpine:latest

# ワーキングディレクトリを設定
WORKDIR /app

# ビルドステージからコンパイル済みの実行ファイルをコピー
COPY --from=builder /app/myapp .

# アプリケーションの実行
CMD ["./myapp"]

注意点とおすすめポイント:

  • イメージサイズの劇的な削減: ビルドツール、SDK、中間ファイルなどが最終イメージに含まれないため、数GBだったイメージが数十MBになることも珍しくありません。
  • セキュリティの向上: 最終イメージに含まれるレイヤーやソフトウェアが最小限になるため、潜在的な脆弱性の数を減らすことができます。
  • デプロイ時間の短縮: イメージが小さいため、レジストリへのプッシュやそこからのプルが高速化され、CI/CDパイプライン全体のスループットが向上します。
  • キャッシュの有効活用: 各ステージのコマンドは独立してキャッシュされるため、コードの変更があっても依存関係のダウンロードなどはスキップされ、ビルド時間を短縮できます。