Go言語

実務で使えるGoアプリのDockerコンテナ入門

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

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

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

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

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

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

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

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

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

Beyond Careerに無料相談する

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


スポンサードリンク

導入:Goアプリのコンテナ化で得られる利点と全体フロー

Goアプリのコンテナ化は、開発と本番の環境差を減らし、デプロイの自動化と供給連鎖の管理を容易にします。ここでは実務で使えるDockerfile、CIワークフロー、CA/TLS・非root実行、SBOM/スキャン/署名までを一貫して示し、Goアプリのコンテナ化を再現性高く安全に進める手順を提供します。

クイックスタート:最小のHTTPサーバーとローカルでの検証

最短で動作確認したい方向けに、最小のHTTPサーバーコードとローカルでのビルド/実行手順を示します。まず動かして問題がないことを確認し、その後Docker化やCIに進んでください。

サンプルHTTPサーバー(main.go)

シンプルなHTTPサーバーで動作確認を素早く行えます。

ローカルでの最短実行手順

ローカル確認用の最小手順です。ワーキングディレクトリはプロジェクトルートを想定します。

  1. バイナリビルド
    go build -o bin/server .

  2. ローカルイメージ作成(簡易)
    docker build -t myapp:local .

  3. 実行確認
    docker run --rm -p 8080:8080 myapp:local

開発向けのホットリロードと実行パターン

開発時の典型的な運用例と注意点を簡潔に示します。

  • ホットリロードは air / reflex / CompileDaemon 等を利用すると便利です。
  • 開発ではソースをボリュームマウントし、コンテナ内でビルド/実行するパターンがよく使われます。
  • 本番イメージは必ず最小化して、デバッグ用イメージは別途用意してください。

Dockerfile実践:マルチステージとマルチアーキ対応

マルチステージとBuildKitを使うことで、マルチアーキ対応かつ小型で安全なイメージを作れます。ここではARGでTARGETOS/TARGETARCHを受け取り、GOOS/GOARCHを動的に設定する実例を示します。

マルチステージDockerfile(マルチアーキ対応)

BuildKitが提供するTARGET*引数を利用して、クロスビルドの不一致を避けます。ベースイメージは具体的なマイナーバージョンで固定し、可能ならダイジェストでピン留めしてください。

scratch を使う最小例

scratch を使う場合はファイルの所有権と CA を builder 側で整えてからコピーします。scratch では RUN が使えないので事前整備が重要です。

ベースイメージのバージョン固定について

ベースイメージは具体的なマイナーバージョンで指定してください。可能ならダイジェストで固定します。ダイジェスト取得例:

  • docker pull golang:1.20.7
  • docker inspect --format='{{index .RepoDigests 0}}' golang:1.20.7

本番用 Dockerfile はダイジェストに置き換えて運用してください。

CAバンドルとTLS(distroless/scratch対応)

distroless や scratch を使う場合、システムのCAが存在しないと外部HTTPS通信が失敗します。builder で ca-certificates をインストールして最終イメージにコピーしてください。必要なら環境変数 SSL_CERT_FILE を最終イメージで設定します。

  • builder での準備例: apt-get install -y ca-certificates
  • 最終イメージへコピー: COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
  • Go の一部バージョン/構成では別のパスを参照する場合があるため、テストで接続確認を行ってください。

非root実行と所有権の設定

最終イメージは非rootで実行するのが安全です。ただしファイル所有権とパーミッションは事前に整えておく必要があります。主な手順は次の通りです。

  • builder でビルド後に実行ファイルのパーミッションを設定: chmod 0755 /app/server
  • builder で必要なディレクトリを作成し chown する: mkdir -p /app && chown -R 65532:65532 /app
  • 最終イメージへは COPY --chown=65532:65532 を利用して所有権を付与する
  • Kubernetes では securityContext.runAsUser と合わせる(例: 65532)

例(builder内で実行):

例(最終ステージでのコピー):

ボリュームマウント時のUID/GID不一致は initContainer で chown するか、ホストとUIDを揃えることで回避します。

CGOと静的ビルド(要点と回避策)

CGO_ENABLED=0 は多くの場合に有効ですが、常に静的バイナリが得られるわけではありません。特に以下の点に注意してください。

  • CGO を必要とするサードパーティライブラリがある場合、CGO_ENABLED=0 ではビルドできません。依存を確認してください。
  • CGO_ENABLED=1 でクロスコンパイルするにはクロスコンパイラが必要です(例: aarch64 用に gcc-aarch64-linux-gnu 等)。
  • glibc と musl の違いにより、glibc 依存のバイナリを musl ベースのイメージで動かすと失敗します。互換性が必要なら debian-slim 系を使ってください。
  • buildx と QEMU はユーザーランドの実行をエミュレートしますが、クロスコンパイル時のコンパイラ依存は解決しません。CI で実機検証を行ってください。

必要なら「glibc 静的リンク」や「musl ビルド(musl-cross)」などの専門手順を採用してください。

CI/CD実装例:Buildxマルチアーキ、スキャン、SBOM、署名、シークレット管理

CI でマルチアーキ、スキャン、SBOM、署名を自動化すると安全性が高まります。ここでは変数整合を保った GitHub Actions の動作例を示します。重要な点はレジストリ/イメージ/タグを明確に分けることです。

GitHub Actions ワークフロー(動作例)

下記は動作することを想定した雛形です。実運用ではシークレット管理やツールバージョンを固めてください。必須の権限として id-token: write を付与すると cosign の keyless(OIDC)署名が使えます。

上記では IMAGE / REGISTRY / TAG を明示して使い回しています。docker/login-action の registry 引数が REGISTRY を参照している点に注意してください。

署名鍵の扱いとセキュリティ(ベストプラクティス)

署名鍵を CI Secrets に直接置くのはリスクが高いです。代替策を優先してください。

  • 優先: cosign の keyless(OIDC)署名を使う。GitHub Actions の id-token を使うと一時的な署名が可能です。
  • 代替: クラウド KMS(AWS KMS, GCP KMS, Azure KeyVault)に鍵を保管し cosign の KMS 対応を利用する。例: cosign sign --key awskms://arn:...
  • もしシークレット(プライベートキー)を置く場合は最小権限、厳格なローテーション、アクセスログ、有効期限を設定してください。
  • デプロイ前に必ず署名検証を実行し、署名されていないイメージはデプロイさせない仕組みにしてください(下記の deploy ジョブ参照)。

配布前の自動署名検証(デプロイ前ゲート)

署名を持つイメージのみをデプロイするため、デプロイジョブの冒頭で検証を行ってください。例:

検証に失敗した場合、ジョブは停止します。

BuildKit secret / ssh マウントの具体例

BuildKit の secret/ssh マウントは認証情報をイメージに残さずにプライベート依存を取得するのに便利です。Dockerfile と CI 側の整合サンプルを示します。

Dockerfile 側での secret マウントの使い方

Dockerfile 内で secret は /run/secrets/ にマウントされます。ログにトークンを出力しないよう注意してください。

上記はトークンを直接標準出力に出さないようにしています。BuildKit はこのファイルをイメージレイヤに含めません。

GitHub Actions 側での secrets 供給(整合例)

BuildKit の secret をファイル経由で渡す例です。ssh の場合は ssh-agent を用いて buildx に転送できます。

SSH で private repo を使う場合の典型パターン:

Dockerfile 側は次のように ssh を利用します:

注意点と検証

  • ビルドログに認証情報が流出しないよう、RUN コマンド内でトークンを echo しないでください。
  • BuildKit secret はイメージに含まれませんが、誤った RUN ログやファイル操作で漏れることがあるため確認してください。
  • ビルド完了後に一時ファイルが残っていないことをローカルで確認してください。

運用チェックリストとよくあるトラブル対応(実務向け)

運用で必ず確認したい項目と、よく出る障害の速やかな対処法をまとめます。ポイントは自動化と検証の導入です。

主要な運用チェック項目

  • go.mod / go.sum を必ずコミットし、依存が固定されているか確認する。
  • CI で SBOM を生成しアーティファクトとして保存する。
  • 脆弱性スキャンの閾値(例: HIGH/CRITICAL)を定め、結果でパイプラインを失敗させる。
  • 署名(cosign)と検証を CI に組み込み、未署名イメージはデプロイ不可にする。
  • マルチアーキの manifest を docker buildx imagetools inspect で検証する。
  • Kubernetes の securityContext で runAsNonRoot / runAsUser を設定する(例: 65532)。
  • Liveness/Readiness、requests/limits を設定し、ログは stdout/stderr に集約する。

よくあるトラブルと対処(抜粋)

  • permission denied(ファイルアクセス)
  • COPY --chown を使い最終イメージの所有権を正しく設定します。ボリュームマウントのUID差も確認してください。必要なら initContainer で chown します。

  • x509 証明書エラー(HTTPS)

  • scratch/distroless では CA がないことが多いです。builder で ca-certificates を入れ、/etc/ssl/certs/ca-certificates.crt を最終イメージにコピーしてください。アプリで SSL_CERT_FILE を参照している場合はパスを合わせます。

  • CGO 関連のビルド失敗

  • CGO_ENABLED とビルド環境(クロスコンパイラの有無)を確認します。可能なら CGO を無効化して静的ビルドを行い、どうしても CGO が必要な場合は debian 系ベースで glibc を利用する方が安定します。

  • buildx のマルチアーキ不整合

  • Dockerfile で ARG TARGETOS/TARGETARCH/TARGETPLATFORM を使い、ビルド時に GOOS/GOARCH を動的に設定してください。ビルド後に docker buildx imagetools inspect で manifest を確認します。

  • Delve のリモートデバッグ不可

  • 本番で ptrace 等を有効にするのは避けてください。開発専用のデバッグイメージを用意し、必要な権限だけを開けて使います。

参考コマンド集

  • ローカルビルド:
    go build -o bin/server .

  • ローカルイメージ作成:
    docker build -t myapp:local .

  • マルチアーキビルド&プッシュ (buildx):
    docker buildx build --platform linux/amd64,linux/arm64 -t //: --push .

  • マニフェスト確認:
    docker buildx imagetools inspect //:

  • 脆弱性スキャン (Trivy, 例):
    docker run --rm aquasec/trivy:latest image --exit-code 1 --severity HIGH,CRITICAL //:

  • SBOM生成 (Syft, 例):
    docker run --rm anchore/syft:latest //: -o json > sbom.json

  • 署名 (Cosign - Keyless/OIDC):
    cosign sign --keyless //:

  • 署名検証 (Cosign):
    cosign verify --keyless //:

まとめ

  • Goアプリのコンテナ化は、環境差を減らし自動化と供給連鎖管理を可能にします。
  • Dockerfile は ARG TARGETOS/TARGETARCH を使いマルチアーキ対応にし、ベースイメージはマイナーバージョンまたはダイジェストで固定してください。
  • distroless/scratch を使う場合は CA バンドルとファイル所有権を builder 側で整え、COPY --chown で最終イメージに反映してください。
  • CI では buildx、Trivy、Syft、Cosign を組み合わせ、署名検証をデプロイ前ゲートに入れてください。
スポンサードリンク

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

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

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

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

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

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

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

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

Beyond Careerに無料相談する

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


-Go言語