Go向けマルチステージDockerビルド
Builderステージと、scratch/alpineを使った最終イメージ
「Go向けマルチステージDockerビルド」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
なぜマルチステージなのか
Goコードをコンパイルする単一ステージのビルドでは、Goツールチェーン全体を含む大きなイメージが生成されます。マルチステージビルドでは、あるステージでコンパイルし、バイナリだけを最小構成の最終イメージにコピーします。
基本的なマルチステージDockerfile
ビルドステージでバイナリをコンパイルし、最終ステージで最小構成のベースにコピーします:
FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server
FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]FROM scratch
FROM scratchイメージには何も含まれていません。シェルもOSライブラリもありません。Goバイナリは静的リンク(CGO_ENABLED=0)され、必要なファイルをすべて明示的に含める必要があります。
FROM distroless
Googleのdistrolessイメージは、シェルを含まない最小限のOSライブラリ(CA証明書やタイムゾーンデータ)を提供します。libcやTLS証明書を必要とするバイナリには、scratchより安全です。
FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]シェル用のFROM alpine
デバッグ用にシェルが必要な場合や、バイナリがCGOを使用する場合は、最終ベースにAlpineを使用します。Alpineは約5MB追加されますが、シェルとパッケージマネージャーが含まれています。
go.modのレイヤーキャッシュ
最初にgo.modとgo.sumをコピーし、ソースコードをコピーする前にgo mod downloadを実行します。このレイヤーは依存関係が変更されるまでキャッシュされるため、再ビルドが高速になります。
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...-ldflags="-s -w"
-sはシンボルテーブルを削除し、-wはDWARFデバッグ情報を削除します。組み合わせることで、実行時への影響なくバイナリサイズを30〜50%削減できます。
ビルド引数
ARGを使用して、ビルド時にバージョン情報を注入します:
ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .非rootユーザー
セキュリティのため、非rootユーザーとしてバイナリを実行します。ベースイメージにユーザーを追加するか、distrolessのnonrootタグを使用します:
FROM gcr.io/distroless/static-debian12:nonroot最終イメージのサイズ
scratchを使用した一般的なGoバイナリのサイズは5〜20MBです。Alpineを使用すると約5MB追加されます。完全なgolangイメージは約800MBです。マルチステージビルドにより、攻撃対象領域とイメージのプル時間を大幅に削減できます。
.dockerignore
.dockerignoreを追加して、ビルドコンテキストからファイルを除外します。例:vendor/、.git/、*.test、*.prof。これによりDockerビルドが高速になり、機密ファイルが含まれるのを防げます。
.git
vendor
*.test
*.prof
.envクイックチェック
FROM scratchのDockerイメージ用にGoバイナリをビルドする際、なぜCGO_ENABLED=0を設定する必要がありますか?
まとめ:マルチステージDockerビルド
重要なポイント:
- ビルドステージにはgolangイメージ、最終ステージにはscratch/distroless/alpineを使用します
- 静的バイナリにはCGO_ENABLED=0を設定します(scratchでは必須)
- レイヤーキャッシュのためにgo.modを先にコピーし、バイナリを小さくするために-ldflags="-s -w"を使用します
- .dockerignoreで.git、vendor、テストファイルを除外します
よくある質問
「Go向けマルチステージDockerビルド」レッスンは無料ですか?
はい。「Go向けマルチステージDockerビルド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「Go向けマルチステージDockerビルド」で何を学びますか?
Builderステージと、scratch/alpineを使った最終イメージ ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Go向けマルチステージDockerビルド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Go向けマルチステージDockerビルド
- 環境設定とシークレット
- ローカル開発のためのDocker Compose
- ヘルスチェックと本番環境のチューニング