使用 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

部分支持。将 bind、volume 和 tmpfs 装载转换为 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 中的服务都具有由 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,以标记为接收所有外部流量的入站容器。

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 文件定义了顶级 volumes 或 configs,gcloud CLI 会预配一个 Cloud Storage 存储桶来管理此数据。每个部署都会创建一个存储桶,并使用文件夹来分隔卷和配置。

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

所需的角色

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

  • Cloud Storage 存储桶:roles/storage.objectUser
  • Secret Manager Secret:roles/secretmanager.secretAccessor

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

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

后续步骤