You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub触发Cloud Build后,如何部署多容器服务至Cloud Run?

解决Cloud Run多容器服务自动部署的几种方案

不用手动更新service.yaml,这几个高效方法可以帮你搞定:

方案1:用环境变量替换service.yaml中的镜像标签

先在service.yaml里把镜像标签换成占位符,比如:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: multi-container-service
spec:
  template:
    spec:
      containers:
      - image: gcr.io/your-project/main:${COMMIT_SHA}
        name: main
      - image: gcr.io/your-project/sidecar:${COMMIT_SHA}
        name: sidecar

然后在Cloud Build的cloudbuild.yaml中,用envsubst工具替换占位符后再部署:

steps:
# 构建两个容器镜像,标签用COMMIT_SHA
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar']
# 替换service.yaml中的占位符并部署
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    envsubst < service.yaml > updated-service.yaml && \
    gcloud run services replace updated-service.yaml --region=us-central1

Cloud Build会自动把$COMMIT_SHA注入构建环境,无需额外配置。

方案2:直接用gcloud run deploy命令指定多容器

不用维护service.yaml,直接在cloudbuild.yaml里用--set-container参数逐个定义容器:

steps:
# 构建并推送镜像
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar']
# 部署多容器服务
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'run'
  - 'deploy'
  - 'multi-container-service'
  - '--region=us-central1'
  - '--set-container=main=gcr.io/your-project/main:$COMMIT_SHA'
  - '--set-container=sidecar=gcr.io/your-project/sidecar:$COMMIT_SHA'
  # 可添加其他配置参数
  - '--port=8080'
  - '--set-env-vars=ENV=production'

这种方式适合配置不复杂的场景,省去维护yaml的麻烦。

方案3:用Kustomize管理复杂配置

如果服务配置较多,推荐用Kustomize动态替换镜像标签:

  1. 新建kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- service.yaml
images:
- name: gcr.io/your-project/main
  newTag: ${COMMIT_SHA}
- name: gcr.io/your-project/sidecar
  newTag: ${COMMIT_SHA}
  1. 原始service.yaml保持固定镜像名(不带标签):
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: multi-container-service
spec:
  template:
    spec:
      containers:
      - image: gcr.io/your-project/main
        name: main
      - image: gcr.io/your-project/sidecar
        name: sidecar
  1. 在cloudbuild.yaml中用Kustomize生成最终配置并部署:
steps:
# 构建并推送镜像
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar']
# 安装Kustomize(若Cloud Build镜像未预装)
- name: 'alpine'
  entrypoint: 'ash'
  args:
  - '-c'
  - |
    wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.1/kustomize_v5.1.1_linux_amd64.tar.gz && \
    tar xzf kustomize_v5.1.1_linux_amd64.tar.gz && \
    chmod +x kustomize && mv kustomize /usr/local/bin/
# 替换镜像标签并部署
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    kustomize edit set image gcr.io/your-project/main:$COMMIT_SHA gcr.io/your-project/sidecar:$COMMIT_SHA && \
    kustomize build . | gcloud run services replace --region=us-central1 -

每次构建都会自动把镜像标签替换为当前的COMMIT_SHA,全程无需手动修改配置。

内容的提问来源于stack exchange,提问作者DaveW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:57:03