【アップデート】Cloud RunでComposeファイルからのサービスデプロイ機能がPreviewでリリースされました。

【アップデート】Cloud RunでComposeファイルからのサービスデプロイ機能がPreviewでリリースされました。

2025.11.17

はじめに

こんにちは。
クラウド事業本部コンサルティング部の渡邉です。

2025年7月11日には、Google Cloudの公式ブログより、Private Previewで提供していることが発表されていましたが、2025年11月13日に、Cloud RunにComposeファイルからのサービスデプロイ機能がPreviewでリリースされました。

https://cloud.google.com/blog/products/serverless/cloud-run-and-docker-collaboration?hl=en

https://cloud.google.com/run/docs/deploy-run-compose

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へのデプロイ時にはマルチコンテナ機能(サイドカーパターン)でデプロイされます。

compose.yaml
# 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です。

Dockerfile (flask)
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で起動するサンプルアプリケーションコードです。

app.py
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です。

requirements.txt
Flask==3.1.0
gunicorn==23.0.0

nginxコンテナで使用するDockerfileです。

Dockerfile (Nginx)
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です。

nginx.conf
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のリソースが作成されていました。

cloudstorage
Cloud Storage

cloudbuild
Cloud Build

artifactregistry
Artifact Registry

cloudrun
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

cloudbuild.yaml (flask)
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

cloudbuild.yaml (nginx)
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の詳細な設定値に関してはこちらのファイルで管理されています。

cloudrun-compose-deploy-service.yaml
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
  1. 事前チェック
  • プロジェクト情報の取得
  • 必要なGCP APIの有効化確認(Artifact Registry、Cloud Build、Cloud Run等)
  • コンテナイメージのビルド
  1. flaskとnginxの2つのコンテナをCloud Buildで並行ビルド
  • ソースコードをCloud Storageにアップロード
  • DockerイメージをArtifact Registryに保存
  • リソース設定の変換
  1. Compose設定をCloud Run用のYAML形式に変換
  • サービス定義ファイル生成
  • デプロイ実行
  1. 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を利用してみたい場合のさくっと構築には検討してみてもよい機能だと思いました。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部コンサルティング部の渡邉でした!

この記事をシェアする

FacebookHatena blogX

関連記事