使用 Compose 部署服务

本页介绍了如何使用基于 Compose 规范的文件将服务部署到 Cloud Run。

您可以通过以下方式使用 Compose 文件部署到 Cloud Run:

使用 Compose 部署到 Cloud Run 非常适合开发,并可简化从本地环境到云环境的过渡。这样一来,您就可以为本地应用和已部署的应用保持一致的配置格式。

如需在基础设施即代码 (IaC) 环境中管理生产环境,我们建议使用 Terraform

限制

  • Compose 部署会部署具有多个容器的单个 Cloud Run 服务。
  • Compose 部署仅转换部分受支持的 Cloud Run 功能
  • 使用 Compose 创建的服务默认设置为最多 1 个实例
  • 虽然 Cloud Run Compose 部署简化了部署流程,但它无法取代生产环境中的全面基础设施即代码策略。

使用 Compose 从容器映像部署服务

compose.yaml 文件中定义服务,并从现有容器映像部署这些服务。如需了解详情,请参阅部署容器映像

示例:单服务应用

以下示例展示了使用预构建容器映像的 Web 服务的 compose.yaml 文件。

services:
  web:
    image: us-docker.pkg.dev/cloudrun/container/hello
    ports:
      - "8080:8080"

部署服务

  1. 如需部署服务,请运行 gcloud beta run compose up 命令:

    gcloud beta run compose up compose.yaml

  2. 在系统提示时通过响应 y 来响应任何提示,以安装所需组件或启用 API。

  3. (可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开

    部署完成后,系统会显示 Cloud Run 服务网址。复制此网址并将其粘贴到浏览器中,即可查看正在运行的容器。您可以通过 Google Cloud 控制台停用默认身份验证。

使用 Compose 从源代码部署

compose.yaml 文件中定义服务,并通过从源代码构建来部署服务。如需了解详情,请参阅从源代码部署服务

示例:单服务应用

以下示例展示了一个 compose.yaml 文件,该文件适用于从当前目录中的源代码构建的 Web 服务。

services:
  web:
    build: .
    ports:
      - "8080:8080"

部署服务

  • 在项目目录中,创建一个包含服务定义的 compose.yaml 文件。

    1. 如需部署服务,请运行 gcloud beta run compose up 命令:

      gcloud beta run compose up compose.yaml
    2. 在系统提示时,通过响应 y 来响应任何提示,以安装所需组件或启用 API。

    3. (可选)如果您想允许对服务进行未经身份验证的访问,请将服务设为公开

    部署完成后,系统会显示 Cloud Run 服务网址。复制此网址并将其粘贴到浏览器中,即可查看正在运行的容器。您可以通过 Google Cloud 控制台停用默认身份验证。

支持的功能

使用 compose.yaml 文件进行部署时,Cloud Run 可以自动预配 Compose 文件中定义的其他 Google Cloud 资源。如果需要资源,Cloud Run 会在创建资源之前提示您征求同意。

Cloud Run 支持以下部分 Compose 功能:

撰写字段 Cloud Run 映射和说明
services

服务会映射到已部署的 Cloud Run 服务中的各个容器。

volumes

部分支持。将 bindvolumetmpfs 装载转换为 Cloud Run 等效项。

secrets

支持。使用 Secret Manager。

configs

支持。使用 Cloud Storage。

build

Cloud Build 使用 build 上下文构建容器,并将其标记和推送到 Artifact Registry 中的 cloud-run-source-deploy 代码库。

image

从受支持的注册表中部署预构建的容器映像。如果您有预构建的映像,请使用此选项。仅支持 Docker Hub 和 Artifact Registry 映像。对于自定义映像,您可以将映像推送到 Artifact Registry 并使用它们。

ports

端口映射列表(例如 8080:8080),用于确定入站容器。

expose

要公开但不发布的端口列表,例如 3000,以确保依赖服务具有可用于通信的端口。

depends_on

定义容器启动顺序。这可确保任何列在 run-compose 中的服务都具有由 portsexpose 定义的端口,以便其他容器可以与其通信。

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,以标记为接收所有外部流量的入站容器。

x-google-cloudrun:volume-type: in-memory

(扩展)将此 Google 特有的扩展添加到卷,并将其设置为 in-memory,而不是由 Cloud Storage 支持的默认卷。

映射到 Secret Manager 的 Secret

如果您的 compose.yaml 文件定义了 secrets,gcloud CLI 会预配 Secret Manager 密文来存储此数据。

映射到 Cloud Storage 的卷和配置

如果您的 compose.yaml 文件定义了顶级 volumesconfigs,gcloud CLI 会预配一个 Cloud Storage 存储桶来管理此数据。每个部署都会创建一个存储桶,并使用文件夹来分隔卷和配置。

  • 命名卷:系统会在存储桶中创建一个与卷名称对应的空文件夹。
  • 绑定挂载:对于绑定挂载,Cloud Run 会在部署之前将本地源目录的内容上传到存储桶中的文件夹。
  • 配置:对于使用 file: 来源定义的每个配置,Cloud Run 会将本地文件的内容上传到存储桶中的文件夹。

所需的角色

在部署期间,Cloud Run 会自动向已部署服务的服务身份授予访问已预配资源所需的角色:

  • Cloud Storage 存储分区roles/storage.objectUser
  • Secret Manager Secretroles/secretmanager.secretAccessor

同一实例的容器之间的通信

Cloud Run 会在每个容器的 /etc/hosts 文件中添加一个条目。此条目将 compose.yaml 文件中的服务名称映射到其内部 IP 地址,从而使服务能够使用其服务名称相互通信。

后续步骤