Cloud Runのコンテナ実行要件
Cloud Runは、いくつかの要件を満たすコンテナを実行できます。Googleのドキュメントでは、リクエストはデフォルトでポート8080に送信され、イングレスコンテナに環境変数PORTが設定されます。また、コンテナは「0.0.0.0でリクエストを待ち受ける必要がある」「127.0.0.1では待ち受けるべきではない」とされています。Cloud Runは「Linux x86_64 ABI形式を明示的にサポート」し、複数アーキテクチャのイメージにはlinux/amd64が必要とも記載されています。
Macでの開発でつまずきやすいのは、このうち2点です。localhostにバインドするアプリはローカルのターミナルでは動いてもCloud Runでは失敗します。また、Appleシリコンでネイティブにビルドしたイメージはarm64です。実際のコンテナをローカルでテストすれば、デプロイ前に両方を見つけられます。
AppleシリコンでCloud Runサービスをローカルテストする
- $PORTと0.0.0.0で待ち受けます。 サーバーに環境変数
PORTを読み取らせ(Cloud Runのデフォルト送信先は8080)、127.0.0.1ではなく0.0.0.0にバインドします。 - linux/amd64向けにビルドします。
docker buildx build --platform linux/amd64 --load -t my-service .を実行します。Cloud RunはLinux x86_64 ABIをサポートするため、Macでネイティブにビルドしたarm64イメージはターゲットが異なります。 - Cloud Runと同じ方法で実行します。
docker run --rm --platform linux/amd64 -e PORT=8080 -p 8080:8080 my-serviceを実行します。Oxcartはamd64イメージをRosetta経由で動かします。 - サービスを呼び出します。
curl localhost:8080を実行します。PORTの処理を確認するため、-e PORT=9090 -p 9090:9090で2つ目のインスタンスを起動します。 - Artifact Registryへプッシュします。
gcloud auth configure-docker REGION-docker.pkg.devを一度実行し、イメージにREGION-docker.pkg.dev/PROJECT/REPO/my-service:TAGというタグを付け、docker pushで送信します。
Oxcartで実行したもの
$PORTにバインドする小さなPythonサービスを異なるポートで2回実行し、Google自身のサンプルイメージも実行しました。
docker run -d -e PORT=8080 -p 18081:8080 my-service
docker run -d -e PORT=9090 -p 18090:9090 my-service
curl localhost:18081 # hello from PORT=8080
curl localhost:18090 # hello from PORT=9090
docker run -d -e PORT=8080 -p 8081:8080 us-docker.pkg.dev/cloudrun/container/hello
docker image inspect us-docker.pkg.dev/cloudrun/container/hello --format '{{.Os}}/{{.Architecture}}'
# linux/amd64
curl localhost:8081 # "It's running!" Googleのサンプルはamd64専用イメージです。Oxcartはこれを取得し、追加フラグなしでRosetta経由で実行しました。自分でビルドしたamd64専用イメージには、docker runでも--platform linux/amd64を指定してください。テストでは、ローカルでビルドしたamd64イメージはプラットフォーム指定時にしか見つかりませんでした。
Appleシリコンでlinux/amd64向けにビルドする
# Cloud Run target: amd64
docker buildx build --platform linux/amd64 --load -t my-service:amd64 .
# Both architectures in the local image store (runs locally either way)
docker buildx build --platform linux/amd64,linux/arm64 -t my-service:multi . Oxcartのデフォルトビルダーにはlinux/amd64とlinux/arm64の両方が表示され、複数プラットフォームのビルドはローカルで完了し、どちらも実行できます。Oxcartからの複数プラットフォームイメージのプッシュには対応していないため、Cloud Runには実際に実行されるamd64タグをプッシュしてください。小さなローカルコンテキストのビルドはキャッシュなしで341 ms、キャッシュありで121 msと速く、テストした3つのランタイムで最速でした。
Artifact Registryへプッシュしてデプロイする
gcloud auth configure-docker us-central1-docker.pkg.dev
docker tag my-service:amd64 us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0
docker push us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0
gcloud run deploy my-service \
--image us-central1-docker.pkg.dev/my-project/apps/my-service:1.0.0 --region us-central1 Composeで依存サービスを動かす
Cloud Runサービスは通常、データベース、キャッシュ、別のサービスと通信します。Composeで一緒に実行し、サービスの環境にPORTを設定して、ヘルスチェックで起動順を制御します。
services:
api:
build: .
platform: linux/amd64
environment:
PORT: "8080"
REDIS_URL: redis://cache:6379
ports: ["8080:8080"]
depends_on:
cache:
condition: service_healthy
cache:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 2s
retries: 30 docker compose up -d --waitはキャッシュが正常になり、APIが起動すると戻ります。AppleシリコンのComposeガイドでは、ヘルスチェック、amd64イメージ、ポートを詳しく説明しています。
Macのポート
公開ポートはDockerのデフォルトと同様に、Macのすべてのインターフェースで待ち受けます。別のMacアプリがすでに127.0.0.1:8080で待ち受けていると、localhost:8080がコンテナではなくそのアプリに到達する場合があります。空いているホストポート(-p 18080:8080)を選び、PORTはCloud Runの設定どおりに保ちましょう。OxcartのPorts画面はMac上のすべての待ち受けサービスをコンテナと並べて表示し、コンテナのポートが応答しない理由を説明します。コンテナ内のサーバーが127.0.0.1にバインドしている場合も対象です。これはCloud Runでも拒否される同じ誤りです。Macのコンテナネットワークを参照してください。
よくある質問
MacでCloud Runサービスをローカル実行するには?
PORT変数を設定し、ポートを公開してコンテナを実行します:docker run -e PORT=8080 -p 8080:8080 IMAGE。これはGoogleがDockerでのローカルテスト用に説明している方法です。Oxcartでは自作イメージのポート8080と9090、およびGoogleのus-docker.pkg.dev/cloudrun/container/helloサンプルで確認しました。
AppleシリコンでビルドしたイメージのCloud Runへのデプロイが失敗するのはなぜですか?
Googleによると、Cloud RunはLinux x86_64 ABIをサポートし、複数アーキテクチャのイメージにはlinux/amd64が必要です。Appleシリコン Macで通常のdocker buildを実行するとarm64イメージになります。--platform linux/amd64でビルドしてください。
デプロイ前にamd64イメージをMacで実行できますか?
はい。Oxcartはlinux/amd64イメージをRosetta経由で実行します。ローカルで自作したamd64専用イメージには--platform linux/amd64を指定してください。Googleのhelloサンプルなど、取得したamd64イメージはテストでは指定なしで動作しました。
ローカルでは動くのに、Cloud Runでポートを待ち受けられないと言われます。なぜですか?
最も多い原因は、127.0.0.1やハードコードしたポートへのバインドです。Cloud Runの実行要件では、コンテナは0.0.0.0でPORTのポートを待ち受ける必要があります。デフォルト以外のPORT(9090など)でローカルテストし、ハードコードされたポートを見つけましょう。
gcloud beta code devやCloud Codeは必要ですか?
いいえ、任意です。Googleはローカルテストの方法として、通常のDocker、Google Cloudへのアクセスを持つDocker、Cloud Codeエミュレータ、gcloud beta code devを挙げています。Oxcart上のDockerなら、イメージとPORTの処理を直接テストできます。gcloud beta code devはminikubeまたは既存のKubernetesコンテキストを使う開発フローを追加します。その連携が必要な場合に選んでください。
ローカルコンテナにGoogle Cloud APIへのアクセスを与えるには?
Googleの「Google Cloudへのアクセスを持つDocker」の説明に従って認証情報をマウントします。通常はマウントしたファイルとGOOGLE_APPLICATION_CREDENTIALSでApplication Default Credentialsを渡します。Oxcartのコンテナからの外向き接続はMacが開くため、MacのVPNとDNSが適用されます。
出典と測定方法
- 例のテスト環境:Oxcart 0.1.2、Mac17,14、macOS 27.2、2026-10-10(PORTは8080と9090、Googleのhelloサンプルをlinux/amd64で実行、Buildxの単一・複数プラットフォームビルド)。
- Cloud Runのコンテナ実行要件(ポート、0.0.0.0、x86_64):https://docs.cloud.google.com/run/docs/container-contract。ローカルテストの選択肢:https://docs.cloud.google.com/run/docs/testing/local と https://docs.cloud.google.com/sdk/gcloud/reference/beta/code/dev。2026-10-10に確認。
- ビルド速度:Oxcart 0.1.2、2026-10-10、Apple M5 Max、8 CPU、12 GiB、5回の測定の中央値。ほかのランタイムは同日のそれ以前に、同じMacと測定環境でdocker 29.4クライアントを使って測定しました。