Google Cloud の利用下では、Dockerfile を使って FROM 句で DockerHub から Python 付きのイメージを pull するよう記述してデプロイする方式では Python に関する問題についてサポートを受けられないことがわかりました。
サポートを受けるためには Google のサポートしているランタイムを使用する必要があり...
https://cloud.google.com/run/docs/configuring/services/runtime-base-images?hl=ja
リファレンスのつなぎ合わせとサポートへの問い合わせとでやっとたどり着いた。
上から下まで一連で書かれているページがないので書き残しておく。
前提条件
・デプロイ直後のトラフィックが 0% になるようにし、デプロイ直後に新旧が入れ替わらないように配慮
・Python3.11 で固定する
・使用する Google の Builder を google-22 で固定する
1 Python のバージョン固定
ソースディレクトリ直下に .python-version という名前でファイルを置く
中身は以下
3.11
2 gunicorn の起動設定
ソースディレクトリ直下に Procfile という名前でファイルを置く
以下は中身の例
web: gunicorn --bind :$PORT --workers 2 --timeout 300 main:app
3 ビルダーの固定
ソースディレクトリ直下に project.toml という名前でファイルを置く
中身は以下
[build]
builder = "gcr.io/buildpacks/builder:google-22"
4 ソースからのデプロイ実行
ここまでで src 配下が以下のようになっている
/src/.python-version
/src/Procfile
/src/api/[main から使用されるプログラム群]
/src/main.py
/src/project.toml
/src/requierements.txt (書いておくと自動ビルド時に pip install される)
コマンドオプションの詳細はシステム要件によって異なると思うので
リファレンス を参考に
ソースからデプロイを実行する
gcloud run deploy [サービス名] \\
--source . \\
--no-traffic \\ ★ 2 度目以降にデプロイする場合、traffic 0% とするために付与
--cpu-throttling \\ CPU を使っているときだけ課金
--execution-environment gen1 \\ 小さいアプリなら第一世代 [世代について](https://cloud.google.com/run/docs/about-execution-environments?hl=ja)
--region [リージョン名] \\ ex) asia-northeast1
--ingress internal \\ ★ 内部からコールされるだけなら外部からのアクセスは遮断でよい
--no-allow-unauthenticated \\ サービスアカウントによるアクセスに限る。 allow- にすると認証しない
--service-account xxx \\
--min-instances 0 \\ ★リクエストのない時間帯はインスタンスが 0 になり課金されなくなる
--max-instances 1 \\ ★ 指定しないと無尽蔵に増えるので設定必須
--cpu XX \\
--memory XXG \\
--revision-suffix \\ XXXXXX
--tag \\ XXXXX
--timeout \\ nginx のタイムアウト
実行すると
Cloud Build により自動ビルドが行われ、Artifact Registory に自動でコンテナイメージが登録され、そのイメージを使ってアプリケーションのサービスがセットアップされる。ログは Cloud Build のページや Cloud logging の Buider ログで確認できる。
5 Artifact Registry に上がったコンテナイメージにデプロイしたものと同じタグを付与しておく
これをやっておかないとデプロイするほどどれがどのバージョンのイメージかわからなくなっていく
gcloud artifacts docker tags add \\
[イメージ名(パス+サービス名]:latest \\
[イメージ名(パス+サービス名]:[revision-suffix で指定したものと同じバージョン]
ex) asia-northeast1-docker.pkg.dev/[myproject]/cloud-run-source-deploy/[myapp]
6 正常にデプロイされていることが確認できたら
Cloud Run ページの [リビジョン] タブでトラフィックを切り替えれば OK
補足 : 2 段式デプロイ
2026/2 に buildpacks の default stack が google-24 に移行されてから google-22 でのソースからのデプロイが失敗するようになった。サポートに問い合わせた結果、移行時不具合で project.toml を記述しても正常に処理されないケースが確認されていて、2/26 現在、解消時期は未定とのこと。影響を受けるのは google-24 でサポートされなくなる Python3.11, 3.12 など。
エラー時の Cloud Build のログ: project.toml で builder:google-22 を固定で利用するように指定しているのに App Engine 向けの google-24 が pull されている ↓
Status: Downloaded newer image for asia-northeast1-docker.pkg.dev/serverless-runtimes/google-24-full/builder/universal:universal_builder_20260202_RC02
public-image-next: Pulling from serverless-runtimes/google-24/run/universal
(略)
Failed to resolve version 3.11 for Python from region asia-northeast1: failed to resolve version matching: 3.11 against [3.14.3 3.14.2 3.14.1 3.14.0 3.13.12 3.13.11 3.13.10 3.13.9 3.13.8 3.13.7 3.13.6 3.13.5 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0]
Failed to resolve version 3.11 for Python from region us: failed to resolve version matching: 3.11 against [3.14.3 3.14.2 3.14.1 3.14.0 3.13.12 3.13.11 3.13.10 3.13.9 3.13.8 3.13.7 3.13.6 3.13.5 3.13.4 3.13.3 3.13.2 3.13.1 3.13.0]
関連: https://github.com/GoogleCloudPlatform/buildpacks/issues/602
関連: https://docs.cloud.google.com/docs/buildpacks/builders
(builder の latest としてはまだ google-22 みたいなんですけれどね...)
回避/軽減については gcloud run deploy --source . でソースから一撃デプロイするのではなく、以下のように 2 段式でデプロイするように修正するのが楽だった。
1. ソースからコンテナイメージを作成し、Artifact Registory にプッシュする
gcloud builds submit \\
--pack builder=gcr.io/buildpacks/buider:google-22,image=[イメージのurl] .
イメージの URL:
[LOCATION]-docker.pkg.dev/[PROJECT_ID]/[REPOSITORY_NAME]/[IMAGE_NAME]
例)
asia-northeast1-docker.pkg.dev/1234567890/cloud-run-app/test-app
2. 作成したイメージでデプロイする
--source の代わりに --image を指定する。
gcloud run deploy [サービス名] \\
--image [1 で作成したイメージの url] . \\
(以下は上の説明同様。)
参考
Cloud Run に提供されているランタイムのサポート期限
https://cloud.google.com/run/docs/runtime-support?hl=ja
Buildpack を使用してアプリケーションをビルドする
https://docs.cloud.google.com/docs/buildpacks/build-application?hl=ja#build_with_command