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パイプライン全体のスループットが向上します。
- キャッシュの有効活用: 各ステージのコマンドは独立してキャッシュされるため、コードの変更があっても依存関係のダウンロードなどはスキップされ、ビルド時間を短縮できます。