Go言語

Go 1.22 のプロジェクト構成と最小サイズ Docker イメージ作成ガイド

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

1️⃣ プロジェクト構成と初期セットアップ

1‑1 ディレクトリ構成例

  • go.mod の作成

bash
go mod init github.com/yourname/my-go-app
go get ./... # 必要な依存を取得

go.mod の先頭行は必ず go 1.22 と書きましょう。

  • .dockerignore に入れるべきパターン(不要ファイルがビルドコンテキストに混ざらないようにします)

gitignore
# ビルド成果物・テストデータは除外
/bin/
*.test

# module 管理ならベンダーは不要
/vendor/

# Git 関連ファイル
.git
.gitignore

# IDE の設定ファイル
.vscode/

ポイント
.dockerignore が正しく機能すれば、Docker ビルドが高速化し CI/CD の安定性も向上します。


2️⃣ マルチステージ Dockerfile で「できるだけ」小さなイメージを作る

2‑1 ベースイメージの選択と書き方

ビルドステージ 推奨ベースイメージ
コンパイル golang:1.22-alpine(Alpine の軽量パッケージマネージャが便利)
ランタイム scratch(完全空のイメージ)
or alpine:3.20-slim(CA 証明書等が必要な場合)

2‑2 Dockerfile 全体例

静的リンクとサイズの実際

  • CGO_ENABLED=0 で生成されるバイナリは 純粋に静的 ですが、Go の標準ライブラリだけでも数 MB 程度になります。
  • 外部 C ライブラリ(例: SQLite, libpq)を使用すると、リンク時にそれらのオブジェクトコードがバイナリに埋め込まれ、10 MB 以上になることもあります
  • scratch ベースは「空」なので実際の最終サイズは バイナリ本体 + 必要最低限のメタデータ に依存します。したがって「5 MB 未満」という表現はあくまで 典型的な純粋 Go バイナリ の目安であり、環境や依存関係により前後することをご留意ください。

3️⃣ ビルドキャッシュと不要ファイルの除去

3‑1 キャッシュを有効にするレイヤー設計

  1. go.mod/go.sum のみを最初にコピー → 依存取得だけがキャッシュ対象
  2. ソースコード全体は後段でコピー → コード変更時のみ再ビルド

3‑2 ビルダー内でテストバイナリや中間生成物を削除


4️⃣ ローカル開発環境の構築:Docker Compose と VS Code Dev Containers

4‑1 docker-compose.yml の基本設定

  • dev サービスは Air(コード変更を検知して自動ビルド)を使うので、ローカルでのフィードバックが高速です。
  • cached オプションは Docker Desktop のパフォーマンス向上に有効です。

4‑2 VS Code Dev Containers 設定 (.devcontainer/devcontainer.json)

ポイント
dockerComposeFile に Compose ファイルをそのまま指定できるため、開発用と本番用の設定が二重管理になるリスクを回避できます。


5️⃣ トラブルシューティングとベストプラクティス

エラー例 主な原因 推奨対処
go.mod: no such file or directory WORKDIR がプロジェクトルートとずれている ビルドステージ冒頭で WORKDIR /app を統一し、.dockerignore で除外したファイルが無いか確認
air: command not found Air が $GOPATH/bin に入っていて PATH が通っていない Dockerfile の dev ステージに ENV PATH=$PATH:/go/bin を追加、またはシンボリックリンクを作成
ポート 8080 が競合している ホスト側で同じポートが別プロセスに占有されている Compose の ports"0.0.0.0:8081:8080" に変更し、VS Code 側のデバッグ設定も合わせる

5‑1 ビルドログを詳細に見るコマンド

レイヤーごとのキャッシュヒット/ミスが平文で出力され、原因特定が容易になります。


6️⃣ CI/CD パイプラインへの組み込み:GitHub Actions

6‑1 ワークフロー全体像

  • マルチプラットフォーム対応linux/amd64,linux/arm64 を指定すれば、Apple Silicon でも同一イメージを取得可能。
  • ビルドキャッシュの再利用:自レジストリに cache タグで保存したレイヤーは次回以降のジョブでインクリメンタルに使用できます。

📌 最終まとめ

項目 重要ポイント
プロジェクト構成 main.go, go.mod (go 1.22), Dockerfile, .dockerignore を明確に分離し、.dockerignore で不要ファイルを除外するだけでビルドが高速化
マルチステージ Dockerfile golang:1.22-alpinescratch(または alpine:slim)の構成で、静的リンク-ldflags="-s -w" によりバイナリサイズを最小化。ただし外部 C ライブラリや CGO の有無により実際のサイズは変動する点に注意
キャッシュ設計 go.mod/go.sum の先行コピーで依存取得だけをキャッシュ対象にし、ソース変更時のみ再ビルド。ビルダー内でテストバイナリや一時ファイルを削除してレイヤー肥大化を防止
ローカル開発 Docker Compose と VS Code Dev Containers の併用で、本番ビルドと同一のコードベースからホットリロード環境が構築でき、チーム全員が統一された開発体験を得られる
トラブルシューティング WORKDIRPATH・ポート設定の相違が多くのエラー原因。ビルドログ (--progress=plain) でレイヤーキャッシュ状態を確認すると問題解決が迅速になる
CI/CD 自動化 GitHub Actions の docker/build-push-action@v5 と BuildKit キャッシュを活用すれば、プッシュごとにマルチアーキテクチャ対応イメージが自動生成・配布可能

これらのベストプラクティスに沿ってプロジェクトを構築すれば、Go 1.22 の最新機能を活かしつつ、軽量で安全な Docker イメージを本番環境へシームレスにデプロイできるようになります。ぜひ実際のリポジトリで試してみてください。

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Go言語