IIDA

GCPのCloud runにデプロイしたら.envファイルが読み込めなかった話

GCPのCloud runにデプロイしたら.envファイルが読み込めなかった話

7/23/2025

最近、個人開発しているポートフォリオサイト(Next.js製)を Google Cloud Platform (GCP)Cloud Run にデプロイしたところ、ローカルでは動いていた .env 環境変数が反映されず、API通信やOGP設定などが軒並み崩壊していました。

この記事ではその原因と解決方法を、Next.js × Docker × Cloud Build × Cloud Run の構成で紹介します。

事象

Cloud Run にデプロイ後、Next.jsアプリが NEXT_PUBLIC_API_KEYRECAPTCHA_SECRET_KEY などの環境変数を読み込んでおらず、次のような問題が発生しました。

  • API キーが未定義 → データ取得エラー
  • Google reCAPTCHA が動作しない
  • OGP画像がデフォルトになる

ローカルでは .env にちゃんと書いてあり、npm run dev では問題なく動いていたのに、Cloud Run では全滅という地獄。

原因

結論から言うと:

.env ファイルは Docker ビルド時に含まれていなかった
かつ
Cloud Run 側にも環境変数が設定されていなかった

よくある勘違い

  • .env.gitignore に入れてる → GitHub経由のCloud Buildでは .env がビルド対象外
  • Dockerfile では .env を読み込む仕組みがない(明示的に取り込まないと反映されない)
  • Cloud Run では、デプロイ時に環境変数を渡さない限り .env は存在しない

解決策

方法①:Cloud Buildで .env を書き出す(おすすめ)

Cloud Build の cloudbuild.yaml.env を作るステップを追加し、Docker ビルド時にそれを含める。

steps:
  - name: "gcr.io/cloud-builders/docker"
    entrypoint: "bash"
    args:
      - "-c"
      - |
        echo "NEXT_PUBLIC_API_KEY=${_NEXT_PUBLIC_API_KEY}" >> .env
        echo "RECAPTCHA_SECRET_KEY=${_RECAPTCHA_SECRET_KEY}" >> .env
        docker build -f Dockerfile -t gcr.io/$PROJECT_ID/${_SERVICE_NAME}:$COMMIT_SHA .

そして Dockerfile 側で .env をコピー:

COPY .env .env

方法②:Cloud Run に直接環境変数を設定する

gcloud run deploy 時に --set-env-vars フラグで指定:

gcloud run deploy my-app \
  --image gcr.io/my-project/my-app \
  --region asia-northeast1 \
  --set-env-vars NEXT_PUBLIC_API_KEY=xxxxx,RECAPTCHA_SECRET_KEY=yyyyy

CI/CDでも使えるし、GUIからも設定可能。

環境まとめ

項目

内容

フレームワーク

Next.js 14

ホスティング

Cloud Run

ビルド

Cloud Build + Dockerfile

環境変数管理

.env or Cloud Run 環境変数

インフラ管理

GitHub Actions + gcloud CLI

学び

  • .env ファイルはあくまでローカル環境向けであり、本番環境では明示的な渡し方が必要
  • Dockerビルドに含める or Cloud Run側で設定する、どちらかを必ずやる
  • セキュリティ的にも、GitHubに .env を push しない方が安全

おわりに

Cloud Run と環境変数の相性はややハマりやすいですが、仕組みを理解すれば問題ありません。今回のようなトラブルも、仕組みを理解して対処すれば怖くない!

同じ構成でつまずいた方の参考になれば幸いです 。

権利に関する表示

  • この記事のヘッダー画像は、Canvaのテンプレートを編集したものでありサイト運営者が原案のものではありません。
© 2025 IIDA Yuto All Rights Reserved.