Go言語

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

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

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

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 イメージを本番環境へシームレスにデプロイできるようになります。ぜひ実際のリポジトリで試してみてください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Go言語