【アップデート】Cloud RunでComposeファイルからのサービスデプロイ機能がPreviewでリリースされました。
はじめに
こんにちは。
クラウド事業本部コンサルティング部の渡邉です。
2025年7月11日には、Google Cloudの公式ブログより、Private Previewで提供していることが発表されていましたが、2025年11月13日に、Cloud RunにComposeファイルからのサービスデプロイ機能がPreviewでリリースされました。
Composeファイルからのサービスデプロイ機能がPrivate PreviewからPreviewに昇格されていましたので、今回は調査&検証してみようと思います。
Composeファイルからのデプロイとは?
従来は、複数のコンテナを連携させるアプリケーションの場合、ローカルでの開発ではDocker Composeで動作確認し、Cloud Runにデプロイする際には、Terraformを利用したり、別の方法でデプロイする必要がありました。
Cloud RunのComposeファイルからのデプロイとは、Docker Compose仕様に基づいたcompose.yamlファイルを使用して、gcloudコマンド一つで、Cloud Runサービスを直接デプロイできる機能です。
つまり、従来のようにローカル開発用とクラウド環境用の設定ファイルを別々に管理する必要がなく、単一のcompose.yamlファイルでローカル環境とCloud Run環境の両方を管理することができます。
Composeデプロイによって解決する課題
従来の方法では、ローカル開発環境とCloud Run環境で異なる設定管理が必要でした。この方法には以下のようなリスクや課題があります。
- ローカル環境とクラウド環境で設定ファイルの二重管理が必要
- 手動での設定変換による設定ミスのリスク
- ローカル環境からクラウド環境への移行時の手間
Composeファイルからのデプロイは、単一の設定ファイルで、最小限の手間でローカル開発環境とCloud Run環境の両方を管理できる仕組みを提供することで、これらのリスクを軽減することができます。
主な特徴
- 統一された設定管理: ローカルとクラウドで同一の
compose.yamlファイルを使用可能 - 自動リソースプロビジョニング: Secret ManagerやCloud Storage、Artifact Registryを自動作成
- シンプルなデプロイ:
gcloud beta run compose upコマンド一つでデプロイ完了
従来のデプロイ方法とComposeデプロイ:どちらを選ぶべきか
従来のデプロイ方法とComposeデプロイの比較表になります。
比較表
| 項目 | 従来のデプロイ方法 | Composeデプロイ |
|---|---|---|
| 設定ファイル | Cloud Run固有の設定が必要 | compose.yamlを直接使用 |
| マルチコンテナ | 個別にコンテナを設定 | compose.yamlで一括定義 |
| デプロイコマンド | gcloud run deploy |
gcloud beta run compose up |
| 推奨環境 | 本番環境・複雑なインフラ | 開発環境・シンプルな構成 |
| インスタンス数 | 柔軟に設定可能 | デフォルトで最大1インスタンス |
Composeデプロイを使うべきパターン
以下の条件に当てはまる場合は、Composeデプロイの採用を検討してもよいと思います。
- ローカル開発からクラウドへのシームレスな移行が必要
- 開発環境やテスト環境での迅速なデプロイ
- 既存のDocker Composeファイルを活用したい場合
- マルチコンテナアプリケーションのプロトタイピング
使用を避けるべき場合
一方、以下のような環境では、従来のデプロイ方法の方が適しています。
- 本番環境のクリティカルサービス
- 複雑なインフラストラクチャ管理が必要な環境
- 高度なスケーリング設定が必要な場合(Composeデプロイはデフォルトで最大1インスタンス)
- Infrastructure as Code戦略が必要な場合
サポートされる機能と制約
サポートされる機能
Composeファイルからのサービスデプロイで現状サポートされているCompose仕様のサブセットの一覧です。
最低限の機能はサポートされています。
| 作成フィールド | Cloud Run のマッピングと説明 |
|---|---|
| services | サービスは、デプロイされた Cloud Run サービス内の個々のコンテナにマッピングされます。 |
| volumes | 部分的にサポートされています。bind、volume、tmpfs マウントを Cloud Run の同等のものに変換します。 |
| secrets | サポートされています。Secret Manager を使用します。 |
| configs | サポートされています。クラウド ストレージを使用します。 |
| build | Cloud Build はビルド コンテキストを使用してコンテナをビルドし、タグ付けして cloud-run-source-deploy Artifact Registry のリポジトリにプッシュします。 |
| image | サポートされているレジストリから、ビルド済みのコンテナイメージをデプロイします。ビルド済みのイメージがある場合に使用します。Docker Hub と Artifact Registry のイメージのみをサポートします。カスタムイメージの場合は、Artifact Registry にイメージをプッシュして使用できます。 |
| ports | 8080:8080 入力コンテナを決定するポート マッピングのリスト ( など)。 |
| expose | 3000 依存サービスが通信に使用できるポートを持つようにするために、公開するが公表しないポートのリスト ( など) 。 |
| depends_on | コンテナの起動順序を定義します。これにより、リストされたサービスに、ports または expose で定義されたポートが割り当てられ、他のコンテナがそのサービスと通信できるようになります。 |
| cpu_count/cpus | Cloud Run の CPU とメモリの制限を設定するために使用されるヒント。次のロジックに従ってリソースを自動的に割り当てます。 <= 2 CPU: 1Gi Memory <= 4 CPU: 2Gi Memory > 4 CPU: 4Gi Memory |
| container_name | 依存関係解決のためのコンテナの名前を設定します。指定されていない場合は、デフォルトでサービス名になります。 |
| environment | Cloud Run 内の対応するコンテナに環境変数を渡します。 |
| command | コンテナによって宣言されたコンテナのデフォルト コマンドを、Cloud Run の args 属性(Dockerfile の CMD 命令など)にマッピングしてオーバーライドします。 |
| entrypoint | サポートされています。 |
| env_file | サポートされています。 |
| x-google-cloudrun:ingress-container | (拡張機能)この Google 固有の拡張機能をサービスに追加し、true すべての外部トラフィックを受信する Ingress コンテナとしてマークするように設定します。 |
| x-google-cloudrun:volume-type: in-memory | (拡張機能)この Google 固有の拡張機能をボリュームに追加し、in-memory Cloud Storage によってバックアップされるデフォルトのボリュームの代わりに設定します。 |
制約事項
Composeデプロイを導入する前に、以下の制約を必ず理解しておく必要があります。
最低限の機能のサブセットのみサポート
Composeデプロイは、Cloud Runでサポートされる機能のサブセットのみを変換します。すべてのCompose仕様の機能がCloud Runで利用できるわけではありませんので、本番環境や運用を見据える場合の細かなチューニングには適していません。
インスタンス数の制限
デフォルトで、Composeデプロイで作成されたサービスは最大1インスタンスに設定されます。
本番環境での使用は非推奨
Composeデプロイは、あくまでも開発環境やテスト環境での使用を想定しています。
本番環境で利用するためには、TerraformなどのIaCを利用してください。
やってみた
構成ファイル
本検証の構成ファイル群はこちらになります。
nginxコンテナをリバースプロキシとしてflaskコンテナへルーティングするサンプルアプリケーションになります。
cloudrun-compose-deploy
├── compose.yaml
├── flask
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
├── nginx
│ ├── Dockerfile
│ └── nginx.conf
今回の検証の要であるcompose.yamlになります。
ローカル開発環境ではdocker-composeを使用してデプロイしますが、Cloud Runへのデプロイ時にはマルチコンテナ機能(サイドカーパターン)でデプロイされます。
# Cloud Run Compose specification
# Deploy with: gcloud beta run compose up compose.yaml
services:
# Nginxコンテナ(メインコンテナ - インターネットからのトラフィックを受信)
nginx:
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- flask
# Cloud Runでのヘルスチェック
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Flaskコンテナ(サイドカーコンテナ)
flask:
build:
context: ./flask
dockerfile: Dockerfile
# サイドカーなので外部ポートは不要(nginxからlocalhostで通信)
expose:
- "5000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
flaskコンテナで使用するDockerfileです。
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
RUN apt-get update && \
apt-get install -y --no-install-recommends curl && \
rm -rf /var/lib/apt/lists/*
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "app:app"]
flaskで起動するサンプルアプリケーションコードです。
from flask import Flask, jsonify
import os
app = Flask(__name__)
# ウェルカムメッセージ
@app.route('/')
def index():
return jsonify({
'message': 'Hello from Flask!',
'status': 'success',
'version': '1.0.0'
})
# ヘルスチェック
@app.route('/health')
def health():
return jsonify({
'status': 'healthy'
})
# サンプルデータの取得
@app.route('/api/data')
def get_data():
return jsonify({
'data': [
{'id': 1, 'name': 'Item 1'},
{'id': 2, 'name': 'Item 2'},
{'id': 3, 'name': 'Item 3'}
]
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
必要なパッケージとそのバージョンをリスト化したrequirements.txtです。
Flask==3.1.0
gunicorn==23.0.0
nginxコンテナで使用するDockerfileです。
FROM nginx:alpine
# カスタムnginx設定ファイルをコピー
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm -f /etc/nginx/conf.d/default.conf
# ヘルスチェック用にwgetをインストール
RUN apk add --no-cache wget
# Cloud Runのデフォルトポート8080を公開
EXPOSE 8080
# nginxをフォアグラウンドで実行
CMD ["nginx", "-g", "daemon off;"]
nginxコンテナで使用するconfigです。
events {
worker_connections 1024;
}
http {
# IPv6での名前解決を無効化
resolver 127.0.0.1 ipv6=off;
upstream flask_app {
# Cloud Runのサイドカーパターンでは同じポッド内で動作
server flask:5000;
}
server {
# Cloud Runのデフォルトポート
listen 8080;
server_name 127.0.0.1;
location / {
proxy_pass http://flask_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /health {
proxy_pass http://flask_app/health;
proxy_set_header Host $host;
}
}
}
ローカル環境へデプロイ
ローカル環境でアプリケーションの動作確認をするために、docker compose up -dコマンドでnginxコンテナとflaskコンテナを起動します。
docker compose up -d
ローカル環境のコンテナの確認
ローカル環境に作成されたコンテナの状態をdocker compose psコマンドで確認します。
nginxコンテナとflaskコンテナの正常起動を確認しました。
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cloudrun-compose-deploy-flask-1 cloudrun-compose-deploy-flask "gunicorn --bind 0.0…" flask 20 seconds ago Up 20 seconds (healthy) 5000/tcp
cloudrun-compose-deploy-nginx-1 cloudrun-compose-deploy-nginx "/docker-entrypoint.…" nginx 20 seconds ago Up 19 seconds (healthy) 80/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp
サービスのエンドポイントへアクセスしてみる
起動したアプリケーションのサービスエンドポイントに対してcurlコマンドでアクセスしてみます。
サービスエンドポイントの一覧は以下になります。
GET /- ウェルカムメッセージGET /health- ヘルスチェックGET /api/data- サンプルデータの取得
# ウェルカムメッセージ
curl http://localhost:8080/
{"message":"Hello from Flask!","status":"success","version":"1.0.0"}
# ヘルスチェック
curl http://localhost:8080/health
{"status":"healthy"}
# サンプルデータ
curl http://localhost:8080/api/data
{"data":[{"id":1,"name":"Item 1"},{"id":2,"name":"Item 2"},{"id":3,"name":"Item 3"}]}
ローカル環境でアプリケーションの起動と、サービスエンドポイントのアクセスを確認しました。
次にローカル環境で作成したこの同じコードでCloud Runへデプロイしてみましょう。
Google Cloud環境へデプロイ
前提条件
- Google Cloud CLIがインストールされていること
- Google Cloudプロジェクトが作成されていること
- 必要なAPIが有効化されていること
- Cloud Run API
- Cloud Build API
- Artifact Registry API
初期設定
自身の環境変数にプロジェクトIDとリージョン情報を設定しておきます。
# プロジェクトとリージョンを設定
export PROJECT_ID="your-project-id"
export REGION="asia-northeast1"
gcloudコマンドを利用してプロジェクトにCloud Runをデプロイをするために認証設定を完了しておきます。
gcloud auth login
gcloud config set project $PROJECT_ID
本検証作業で必要なAPIを有効化します。
# APIの有効化
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
デプロイコマンドの実行
gcloud beta run compose upコマンドを実行し、Cloud Runへサンプルアプリケーションをデプロイしていきます。
デプロイする中で、CloudBuildでのビルド処理や、Cloud Runの作成処理が行われていることがわかります。
gcloud beta run compose up compose.yaml \
--project=$PROJECT_ID \
--region=$REGION
Deploying from Compose to Cloud Run...
Region set to asia-northeast1.You can change the region with gcloud config set run/region asia-northeast1.
Creating AR Repository in the region: asia-northeast1
✓ Setting up resources...
✓ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/fb67764a
-222a-4050-85cb-ed95ff46080c?project=123456789012].
✓ Building container nginx from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/f521e182
-af50-475e-88c9-274864798c7b?project=123456789012].
Resource setup complete.
Deploying service 'cloudrun-compose-deploy' in project 'your-project-id' in region 'asia-northeast1'.
Allow unauthenticated invocations to [cloudrun-compose-deploy] (y/N)? y
✓ Deploying service 'cloudrun-compose-deploy'... Done.
✓ Creating Revision...
✓ Routing traffic...
✓ Setting IAM Policy...
Service 'cloudrun-compose-deploy' has been deployed.
Service URL: https://cloudrun-compose-deploy-xxxxxxxxxxxx-an.a.run.app
デプロイコマンド実行後、Cloud Storage、Cloud Build、Artifact Registry、Cloud Runのリソースが作成されていました。

Cloud Storage

Cloud Build

Artifact Registry

Cloud Run
サービスの確認
Cloud Run ComposeでデプロイされたCloud Runサービスを確認していきます。
# デプロイされたサービスの一覧を表示
gcloud run services list --region=$REGION
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT
✔ cloudrun-compose-deploy asia-northeast1 https://cloudrun-compose-deploy-123456789012.asia-northeast1.run.app user@example.com 2025-11-17T04:38:02.869928Z
# サービスのURLを取得
gcloud run services describe cloudrun-compose-deploy --region=$REGION --format='value(status.url)'
https://cloudrun-compose-deploy-xxxxxxxxxxxx-an.a.run.app
無事デプロイすることができました。
デプロイ後は、Cloud Runが提供するURLでアクセスすることが可能です。
サービスのエンドポイントへアクセスしてみる
ローカル環境と同様に、起動したアプリケーションのサービスエンドポイントに対してcurlコマンドでアクセスしてみます。
サービスエンドポイントの一覧は同様に以下になります。
GET /- ウェルカムメッセージGET /health- ヘルスチェックGET /api/data- サンプルデータの取得
# サービスのURLを取得
SERVICE_URL=$(gcloud run services describe cloudrun-compose-deploy --region=$REGION --format='value(status.url)')
# ウェルカムメッセージ
curl $SERVICE_URL/
{"message":"Hello from Flask!","status":"success","version":"1.0.0"}
# ヘルスチェック
curl $SERVICE_URL/health
{"status":"healthy"}
# サンプルデータ
curl $SERVICE_URL/api/data
{"data":[{"id":1,"name":"Item 1"},{"id":2,"name":"Item 2"},{"id":3,"name":"Item 3"}]}
ローカル環境で起動したアプリケーションと、同様にサービスエンドポイントのアクセスを確認することができました。
デプロイ後のディレクトリのファイル構成
Composeファイルからのサービスデプロイを実行した後、topディレクトリ、flaskディレクトリ、nginxディレクトリにそれぞれoutディレクトリが作成されていました。flaskディレクトリ、nginxディレクトリ配下のoutディレクトリには、cloudbuild.yamlが自動的に作成されていました。コマンド実行後に、cloudbuild.yamlの内容に沿ってコンテナイメージをCloud Build上でビルドしていることがわかりました。
cloudrun-compose-deploy
├── README.md
├── compose.yaml
├── flask
│ ├── Dockerfile
│ ├── app.py
│ ├── out
│ │ └── cloudbuild.yaml (new!!)
│ └── requirements.txt
├── nginx
│ ├── Dockerfile
│ ├── nginx.conf
│ └── out
│ └── cloudbuild.yaml (new!!)
└── out
└── cloudrun-compose-deploy-service.yaml (new!!)
flaskディレクトリに作成されたcloudbuild.yaml
images:
- asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest
steps:
- args:
- buildx
- build
- --load
- -t
- asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest
- .
id: 'Build Docker Image: asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest'
name: gcr.io/cloud-builders/docker
nginxディレクトリに作成されたcloudbuild.yaml
images:
- asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest
steps:
- args:
- buildx
- build
- --load
- -t
- asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest
- .
id: 'Build Docker Image: asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest'
name: gcr.io/cloud-builders/docker
topディレクトリ配下には、cloudrun-compose-deploy-service.yamlが作成されていました。
作成されたCloud Runの詳細な設定値に関してはこちらのファイルで管理されています。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: cloudrun-compose-deploy
annotations:
run.googleapis.com/launch-stage: ALPHA
run.googleapis.com/scalingMode: automatic
labels:
managed-by: runcompose
spec:
template:
metadata:
annotations:
run.googleapis.com/startup-cpu-boost: 'true'
run.googleapis.com/execution-environment: 'gen2'
# run.googleapis.com/cpu-throttling: 'false'
run.googleapis.com/container-dependencies: '{"nginx":["flask"]}'
labels:
managed-by: runcompose
spec:
containers:
- name: flask
image: asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_flask@sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
env:
startupProbe:
timeoutSeconds: 240
periodSeconds: 240
failureThreshold: 1
tcpSocket:
port: 5000
resources:
limits:
cpu: 1000m
memory: 1Gi
- name: nginx
image: asia-northeast1-docker.pkg.dev/your-project-id/cloud-run-source-deploy/cloudrun-compose-deploy_nginx@sha256:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
env:
ports:
- containerPort: 8080
name: http1
startupProbe:
timeoutSeconds: 240
periodSeconds: 240
failureThreshold: 1
tcpSocket:
port: 8080
resources:
limits:
cpu: 1000m
memory: 1Gi
gcloud beta run compose upコマンド実行後の流れ
上記のようなファイルが生成がされていたので、gcloud beta run compose upコマンド実行時に--verbosity=debugオプションをつけてコマンド実行時の処理の流れを確認してみました。
すると、以下のような流れでデプロイが実施されていました。
gcloud beta run compose upコマンド実行ログ
gcloud beta run compose up compose.yaml --project=$PROJECT_ID --region=$REGION --verbosity=debug
DEBUG: Running [gcloud.beta.run.compose.up] with arguments: [--project: "***PROJECT_ID***", --region: "asia-northeast1", --verbosity: "debug", COMPOSE_FILE: "compose.yaml"]
Deploying from Compose to Cloud Run...
Region set to asia-northeast1.You can change the region with gcloud config set run/region asia-northeast1.
DEBUG: Starting new HTTPS connection (1): cloudresourcemanager.googleapis.com:443
DEBUG: https://cloudresourcemanager.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/alt=json HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): artifactregistry.googleapis.com:443
DEBUG: https://artifactregistry.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/locations/asia-northeast1/repositories/cloud-run-source-deploy?alt=json HTTP/1.1" 404 None
Creating AR Repository in the region: asia-northeast1
DEBUG: Starting new HTTPS connection (1): artifactregistry.googleapis.com:443
DEBUG: https://artifactregistry.googleapis.com:443 "POST /v1/projects/***PROJECT_ID***/locations/asia-northeast1/repositories?alt=json&repositoryId=cloud-run-source-deploy HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): artifactregistry.googleapis.com:443
DEBUG: https://artifactregistry.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/locations/asia-northeast1/operations/***OPERATION_ID***?alt=json HTTP/1.1" 200 None
DEBUG: https://artifactregistry.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/locations/asia-northeast1/repositories/cloud-run-source-deploy?alt=json HTTP/1.1" 200 None
DEBUG: Found executable on path: /usr/bin/run-compose
DEBUG: Executing command: ['/usr/bin/run-compose', 'resource', 'compose.yaml', '--region', 'asia-northeast1']
DEBUG: Successfully parsed resources config proto.
DEBUG: ResourcesConfig:
<googlecloudsdk.command_lib.run.compose.compose_resource.ResourcesConfig object at 0x75b9863382f0>
DEBUG: Starting new HTTPS connection (1): serviceusage.googleapis.com:443
DEBUG: https://serviceusage.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/services/artifactregistry.googleapis.com?alt=json HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): serviceusage.googleapis.com:443
DEBUG: https://serviceusage.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/services/cloudbuild.googleapis.com?alt=json HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): serviceusage.googleapis.com:443
DEBUG: https://serviceusage.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/services/cloudresourcemanager.googleapis.com?alt=json HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): serviceusage.googleapis.com:443
DEBUG: https://serviceusage.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/services/run.googleapis.com?alt=json HTTP/1.1" 200 None
DEBUG: Starting new HTTPS connection (1): serviceusage.googleapis.com:443
DEBUG: https://serviceusage.googleapis.com:443 "GET /v1/projects/***PROJECT_ID***/services/storage.googleapis.com?alt=json HTTP/1.1" 200 None
Setting up resources...
. Building container flask from source...
. Building container nginx from source...
DEBUG: Wrote Cloud Build config to 'flask/out/cloudbuild.yaml'
⠹ Setting up resources... '
⠧ Setting up resources...
DEBUG: Starting new HTTPS connection (1): storage.googleapis.com:443
DEBUG: https://storage.googleapis.com:443 "GET /storage/v1/b/***BUCKET_NAME***?alt=json HTTP/1.1" 200 819
DEBUG: https://storage.googleapis.com:443 "GET /storage/v1/b?alt=json&maxResults=1000&prefix=***BUCKET_PREFIX***&project=***PROJECT_ID*** HTTP/1.1" 200 985
INFO: Not using ignore file.
DEBUG: Added dir [out]
DEBUG: Added [app.py]
DEBUG: Added [Dockerfile]
⠹ Setting up resources...
DEBUG: Added [out/cloudbuild.yaml]
INFO: Uploading [/tmp/***TEMP_FILE***/file.tgz] to [***BUCKET_NAME***/source/***SOURCE_FILE***.tgz]
DEBUG: https://storage.googleapis.com:443 "POST /upload/storage/v1/b/***BUCKET_NAME***/o?alt=json&name=source%2F***SOURCE_FILE***.tgz&uploadType=multipart HTTP/1.1" 200 1061
DEBUG: Submitting build to Google Cloud Build
DEBUG: submitting build: <Build
dependencies: []
images: ['asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest']
secrets: []
source: <Source
storageSource: <StorageSource
bucket: '***BUCKET_NAME***'
generation: ***GENERATION***
object: 'source/***SOURCE_FILE***.tgz'>>
steps: [<BuildStep
allowExitCodes: []
args: ['buildx', 'build', '--load', '-t', 'asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest', '.']
env: []
id: 'Build Docker Image: asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_flask:latest'
name: 'gcr.io/cloud-builders/docker'
results: []
secretEnv: []
volumes: []
waitFor: []>]
⠧ Setting up resources...
⠹ Setting up resources...
⠹ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
?project=***PROJECT_NUMBER***].
. Building container nginx from source...
⠼ Setting up resources...
⠏ Setting up resources... '
⠏ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
?project=***PROJECT_NUMBER***].
DEBUG: https://storage.googleapis.com:443 "GET /storage/v1/b/***BUCKET_NAME***?alt=json HTTP/1.1" 200 819
DEBUG: https://storage.googleapis.com:443 "GET /storage/v1/b?alt=json&maxResults=1000&prefix=***BUCKET_PREFIX***&project=***PROJECT_ID*** HTTP/1.1" 200 985
INFO: Not using ignore file.
⠛ Setting up resources...
⠶ Setting up resources...
⠶ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
?project=***PROJECT_NUMBER***].
INFO: Uploading [/tmp/***TEMP_FILE***/file.tgz] to [***BUCKET_NAME***/source/***SOURCE_FILE***.tgz]
DEBUG: https://storage.googleapis.com:443 "POST /upload/storage/v1/b/***BUCKET_NAME***/o?alt=json&name=source%2F***SOURCE_FILE***.tgz&uploadType=multipart HTTP/1.1" 200 1061
DEBUG: Submitting build to Google Cloud Build
DEBUG: submitting build: <Build
dependencies: []
images: ['asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest']
secrets: []
source: <Source
storageSource: <StorageSource
bucket: '***BUCKET_NAME***'
generation: ***GENERATION***
object: 'source/***SOURCE_FILE***.tgz'>>
steps: [<BuildStep
allowExitCodes: []
args: ['buildx', 'build', '--load', '-t', 'asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest', '.']
env: []
id: 'Build Docker Image: asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_nginx:latest'
name: 'gcr.io/cloud-builders/docker'
results: []
secretEnv: []
volumes: []
⠹ Setting up resources...
⠶ Setting up resources...
⠧ Setting up resources...
⠛ Setting up resources...
⠛ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠹ Setting up resources...
⠹ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠧ Setting up resources...
⠧ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠏ Setting up resources...
⠏ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠛ Setting up resources...
⠛ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠧ Setting up resources...
⠧ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠶ Setting up resources...
⠶ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠛ Setting up resources...
⠛ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠹ Setting up resources...
⠹ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠶ Setting up resources...
⠶ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠛ Setting up resources...
⠛ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
?project=***PROJECT_NUMBER***].
⠛ Building container nginx from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠏ Setting up resources...
⠏ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠶ Setting up resources...
⠶ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠧ Setting up resources...
⠧ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
⠏ Setting up resources... 4
✓ Building container flask from source... Logs are available at [https://console.cloud.google.com/cloud-build/builds;region=asia-northeast1/***BUILD_ID***
?project=***PROJECT_NUMBER***].
✓ Setting up resources...
DEBUG: Starting resource handling for project: cloudrun-compose-deploy
DEBUG: Handled ResourcesConfig:
<googlecloudsdk.command_lib.run.compose.compose_resource.ResourcesConfig object at 0x75b9863382f0>
Resource setup complete.
DEBUG: Executing command: ['/usr/bin/run-compose', 'translate', 'compose.yaml', '--resources-config', '{"project": "cloudrun-compose-deploy", "source_builds": {"flask": {"context": "flask", "dockerfile": "Dockerfile", "image_id": "asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_flask@sha256:***IMAGE_HASH***"}, "nginx": {"context": "nginx", "dockerfile": "Dockerfile", "image_id": "asia-northeast1-docker.pkg.dev/***PROJECT_ID***/cloud-run-source-deploy/cloudrun-compose-deploy_nginx@sha256:***IMAGE_HASH***"}}, "secrets": {}, "volumes": {"bind_mount": {}, "named_volume": {}, "bucket_name": null}, "configs": []}', '--project-number', '***PROJECT_NUMBER***', '--region', 'asia-northeast1']
DEBUG: Successfully translated resources config to YAML.
DEBUG: YAML files:
['out/cloudrun-compose-deploy-service.yaml']
Deploying service 'cloudrun-compose-deploy' in project '***PROJECT_ID***' in region 'asia-northeast1'.
DEBUG: Starting new HTTPS connection (1): asia-northeast1-run.googleapis.com:443
DEBUG: https://asia-northeast1-run.googleapis.com:443 "GET /apis/serving.knative.dev/v1/namespaces/***PROJECT_ID***/services/cloudrun-compose-deploy?alt=json HTTP/1.1" 404 None
DEBUG: https://asia-northeast1
- 事前チェック
- プロジェクト情報の取得
- 必要なGCP APIの有効化確認(Artifact Registry、Cloud Build、Cloud Run等)
- コンテナイメージのビルド
- flaskとnginxの2つのコンテナをCloud Buildで並行ビルド
- ソースコードをCloud Storageにアップロード
- DockerイメージをArtifact Registryに保存
- リソース設定の変換
- Compose設定をCloud Run用のYAML形式に変換
- サービス定義ファイル生成
- デプロイ実行
- Cloud Runサービス cloudrun-compose-deploy を更新/作成
- 新しいリビジョンを作成してトラフィックを切り替え
コマンド実行時には、ソースコードをビルドするためのCloud Buildの設定ファイルの作成やビルド実行、Cloud Storageへソースコードのアップロード、Cloud Run用のYAML形式に変換などユーザが意識しないところで実行されて最終的にCloud Runへデプロイされていました。
最後に
2025年11月13日にPreviewとしてリリースされた、Cloud RunのComposeファイルからのサービスデプロイ機能について紹介しました。
Cloud RunのComposeデプロイ機能は、ローカル開発環境とクラウド環境の設定を統一し、開発サイクルを加速させる強力な機能です。
しかし、本番環境で稼働させることを考えて開発を行う場合は、開発段階からIaCやCI/CDプロセスを考えるため、利用することはないかなと思いました。
個人的にはサンプルアプリケーションを試してみたい場合や、PoCでCloud Runを利用してみたい場合のさくっと構築には検討してみてもよい機能だと思いました。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部コンサルティング部の渡邉でした!






