Cloud Runはとても便利なのですが、エラーメッセージがわかりにくいことがあります。特にデプロイしたときに遭遇するこちらのエラーが厄介です:
ERROR: (gcloud.run.deploy) Image 'asia-northeast1-docker.pkg.dev/foo/bar/baz' not found.
コンテナを引っ張ってこれなかったときは原因が何であれこのメッセージだけ残してデプロイが失敗するので、自分で切り分けなければなりません。ここ数ヶ月で複数の原因に遭遇したので記録を残します。
指定したタグを持つコンテナがない
docker build
はしたけど docker push
はしてなかったケース。見つからなかったのは指定したタグを持つイメージなのですが、エラーにはアクセス先レジストリそのものが見つからなかったかのように出てくるので要注意です。
Cloud Run Service Agentに権限がない
project-aのCloud Runから他のプロジェクトproject-bにあるArtifact RegistryやContainer Registryからコンテナを引っ張ってくるときに、project-aのCloud Run Service Agentに適切な権限がないと失敗します。なおCloud Run Service Agentは service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
という名前を持っています。
Artifact RegistryであればArtifact Registry Readerロールが、Container RegistryであればStorage Object Viewerロールが必要になります。
イメージのマニフェストがおかしい
docker/build-push-action
を導入したときに遭遇しました。docker/setup-buildx-action
と組み合わせると application/vnd.oci.image.index.v1+json
media typeを持つイメージにタグが打たれるようになり、これをCloud Runは扱えないようです。イメージが使えるものだということは docker run
で確認したし、公式によるとOCI image formatはサポートしているようなのですが。
docker/build-push-action
単体だと docker build
時と同様に application/vnd.docker.distribution.manifest.v2+json
media typeを持つイメージにタグが打たれるため、Cloud Runでも扱えるイメージができます。
2023/01/23更新
こちらはbuildx 0.10の挙動変更による影響でした。
対策としては docker/build-push-action
の設定に provenance: false
を追加することが推奨されています。