0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Go向けマルチステージDockerビルド
  2. 環境設定とシークレット
  3. ローカル開発のためのDocker Compose
  4. ヘルスチェックと本番環境のチューニング
← Go Academyに戻る