Closed9
GCP 初心者の M1 Mac ユーザーが Cloud Run にデプロイするときにドツボにはまったこと
概要
表題の通りです。
エラーログの追い方と GCP の経験がなかったため、ハマったことがありました。
M1Mac ユーザーで GCP を使っている人からすると当たり前の解決だと思います。
備忘録としてまとめます。
tl;dr
docker を build するときに --platform linux/amd64
をつける。
docker build --platform linux/amd64 -t イメージ名 .
経緯
以下の記事を参考にして、zenn の限定公開をしたかった。
しかし、コピペして実行しても、以下のようなエラーが発生した。
ERROR: (gcloud.run.deploy) The user-provided container failed to start and listen on the port defined provided by the PORT=8000 environment variable. Logs for this revision might contain more information.
調査
docker image が動作するか確認
動いた
> docker run -it イメージ名
👀 Preview: http://localhost:8000
PORT 8000 にアクセスできるか確認
-p
オプションを追加して、ブラウザからアクセスできることを確認。
> docker run -it -p 8000:8000 イメージ名
👀 Preview: http://localhost:8000
gcp 側の環境変数を確認
PORT と認可周りも問題なさそう。
GCP のコンソールからみても問題なかった。
gcloud run deploy "サービス名" \
--image "イメージ名" \
--port 8000 \
--platform managed \
--allow-unauthenticated \
--region asia-northeast1
ログを確認
コンソールに出力されたエラー以外に以下のエラーがあることに気がついた。
"terminated: Application failed to start: Failed to create init process: failed to load /usr/local/bin/npx: exec format error"
調べたら以下の記事がヒット。
ビルドするときには、--platform linux/amd64
をつけないといけないとのこと。
これで動いた。
ちゃんと公式にも書いてあった。
振り返り
- 最初は PORT 周りのエラーだと思った
- PORT のエラーメッセージは PORT そのものではなくて、アプリが起動できていないからヘルスチェックで起動できなかった
- ローカルだと起動できるから挙動を再現できなかった。GCP の仕様に気がつくまで時間がかかった
- ローカルで GCP をエミュレートする方法があるらしいが、試せなかった
このスクラップは2022/12/02にクローズされました