1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人的備忘録:Golang の Dockerfile をテスト用と本番用で比較し、構成の違いを紐解いてみた

Posted at

はじめに

Docker は開発・本番環境の構築を効率化するために広く使われていますが、テスト環境と本番環境で適切な構成を選ぶことが重要です。

本記事では、Golang を使ったテスト用・本番用の Dockerfile の違いを解説し、それぞれの用途や最適な活用方法について紹介します。

書こうと思ったきっかけ

Golang で開発を進める中で、テスト環境ではコード変更を即時反映できるホットリロードが便利ですが、本番環境では軽量でセキュアなコンテナが求められます。

そのため、異なる Dockerfile を用意することが一般的です。

しかし、初心者にとっては「どのような構成が適切なのか」「なぜ分けるのか*」がわかりにくいことがあります。

そこで、テスト用と本番用の Dockerfile を比較し、それぞれの役割を明確にする記事を書こうと思いました。

テスト用と本番用の Dockerfile の違い

テスト用 Dockerfile

FROM golang:1.23.5-alpine3.21  # Golang 1.23.5 + Alpine Linux 3.21の軽量なイメージをベースにする
WORKDIR /usr/src/app            # コンテナ内の作業ディレクトリを設定

COPY go.mod go.sum ./           # 依存関係の管理ファイル (go.mod, go.sum) をコンテナにコピー
RUN go mod download             # 依存関係をダウンロード

COPY . .                        # アプリケーションのソースコードをすべてコンテナにコピー

RUN go install github.com/air-verse/air@latest  # Air(ホットリロードツール)をインストール

特徴・ポイント:

  • 開発・テスト向けの構成
    • Goの公式イメージを利用し、ソースコードをそのままコンテナに取り込む
    • go mod download で依存関係を解決
    • air をインストールすることで、コード変更時に自動リロードできるようにしている

用途:

  • ローカル開発環境やテスト実行用(air を使ってコード変更のたびに即時反映可能)

本番用 Dockerfile

# === ビルド用ステージ ===
FROM golang:1.23.5-alpine3.21 AS builder  # ビルド専用のステージ
WORKDIR /usr/src/app

COPY go.mod go.sum ./  # 依存関係の管理ファイルをコピー
RUN go mod download    # 依存関係をダウンロード

COPY . .               # アプリケーションのソースコードをコピー

RUN CGO_ENABLED=0 GOOS=linux go build -o server .  # 静的バイナリを作成(軽量化)

# === 実行用ステージ ===
FROM alpine:3.21  # 実行時の軽量な Alpine Linux イメージ
COPY --from=builder /usr/src/app/server .  # ビルド済みバイナリのみをコピー
CMD ["./server"]  # アプリケーションを起動

特徴・ポイント:

  • マルチステージビルドを使用

    • golang:1.23.5-alpine3.21 を使ってアプリケーションをビルド(builder ステージ)
    • 実行時は alpine:3.21 のみを使用し、最小限のサイズに抑える
  • 静的リンクバイナリを作成

    • CGO_ENABLED=0 GOOS=linux go build -o server . により、Cライブラリ依存をなくし、どこでも動く軽量なバイナリを生成
    • ビルド後は server バイナリのみをコピーし、余計なツールやライブラリを排除(セキュリティ向上&コンテナサイズ削減)
  • 実行環境の最適化

    • Alpine Linux は軽量でセキュリティが高いため、本番運用に適している
    • CMD ["./server"] でシンプルにアプリを起動

用途:

  • 本番環境向けの最適化されたコンテナ
    • 不要な開発ツールを含めず、軽量なバイナリを実行するだけの構成

まとめ

項目 テスト用 本番用
目的 開発・テスト用 (ホットリロード) 本番運用用(軽量&最適化)
ベースイメージ golang:1.23.5-alpine3.21 golang:1.23.5-alpine3.21alpine:3.21
コード変更の反映 air によりリアルタイムで反映 一度ビルドしたバイナリのみ使用
サイズ Goツール類を含むため重い マルチステージビルドで最小限に
セキュリティ 開発ツールを含むためややリスクあり 実行に不要なツールを排除し安全

開発環境ではテスト用の Dockerfile を使い、動作確認が取れたら本番用の Dockerfile で最適化されたコンテナをデプロイする流れとなります。

改めて記事として体系的にまとめたことで、自分自身の理解も深まりました!

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?