M1 Mac で Cloud Run に デプロイする際の注意点


はじめに

いつも使用しているIntel Mac の調子が悪い!
そうだ、この前買った M1 Mac でこれからは開発しよう!と思い立ったのが昨日の昼間...
特に docker 周りで辛い思いをたくさんしたがローカルでの開発環境は整った。いざデプロイしようと今まで通りのスクリプトを動かしてみたら動かず...

Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information

エラーもポート関係のエラーのようで Dockerfile もスクリプトも読んでも何一つ問題が見当たらない...
普通にデプロイが成功している Intel Mac と比較をしながら調査をしているとどうやら M1 Mac のビルドに問題があるようだった。

前提

デバイス環境

  • MacBookAir (M1, 2020)
  • Apple M1
  • メモリ 16GB
  • macOS Bug Sur

システム環境

  • Docker version 20.10.8
    • Use gRPC FUSE for file sharing OFF
    • Use Docker Compose V2 OFF
  • rosetta2 インストール済み
  • google-cloud-sdk インストール済み

Rosseta の有効

お使いの terminal でまずは 情報を見る → Rosetta を使用して開く を確認し、 Rosetta を有効にします。


M1 でのコンテナのビルド

次に GCR にあげるためのコンテナをビルドします。こちらの工程で従来の Intel Mac とは違ったコマンドが必要になります。

docker buildx build --platform linux/amd64 -t コンテナ名 .

buildx についての公式ドキュメントはこちら
https://matsuand.github.io/docs.docker.jp.onthefly/buildx/working-with-buildx/

どうやら マルチプラットフォームのイメージビルドを行う際に活躍してくれるみたいです。

残りの工程

ビルドができましたら後は従来通りの工程と同じです。tag つけて GCR に push してそれを CloudRun でデプロイするだけ。

タグをつける

docker tag コンテナ名 gcr.io/プロジェクト名/コンテナ名

GCR に Push

docker -- push gcr.io/プロジェクト名/コンテナ名

CloudRun にてデプロイ

gcloud beta run deploy CloudRun 上のサービス名  --project プロジェクト名
...

無事にこれでデプロイできるはずです。
エラーがポート関係
おそらくビルドの際に注意するように心がければ AWS の ECS などの別サービスでもいけるはず。