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

将Cloud Run镜像部署到Kubernetes集群:变量替换失败求助

GKE部署时镜像地址变量未替换导致解析失败的解决办法

问题描述

已通过cloudbuild.yaml成功构建Docker镜像,但使用deployment.yaml部署到GKE集群时,镜像地址中的$PROJECT_ID、${_DEPLOYMENT_TYPE}、$COMMIT_SHA变量未被正确替换,触发以下报错:

Error: failed to prepare deployment: failed to update container of objects: failed to parse reference from image "us-west1-docker.pkg.dev/$PROJECT_ID/abc/abc-server-${_DEPLOYMENT_TYPE}:$COMMIT_SHA": could not parse reference: us-west1-docker.pkg.dev/$PROJECT_ID/abc/abc-server-${_DEPLOYMENT_TYPE}:$COMMIT_SHA

根本原因

Cloud Build仅会替换cloudbuild.yaml自身参数中的变量,不会自动修改deployment.yaml文件内的占位符;而gke-deploy的--image参数作用是直接替换部署配置中的镜像地址,并非解析文件内的变量。原配置中deployment.yaml的镜像地址始终保留未替换的变量,导致Kubernetes无法解析无效的镜像引用。

解决方案

方案1:利用gke-deploy自动替换镜像地址

修改deployment.yaml中的镜像地址为任意占位值,让gke-deploy通过--image参数自动替换该字段:

spec:
  containers:
    - name: idr-server-k8ts-test
      image: placeholder-image # 占位值,会被gke-deploy自动替换
      ports:
        - containerPort: 8080

cloudbuild.yaml中的部署步骤保持不变,--image参数已正确拼接变量后的镜像地址,gke-deploy会自动找到deployment中的容器并替换镜像地址。

方案2:先替换deployment.yaml变量再部署

在Cloud Build步骤中添加变量替换操作,先处理deployment.yaml中的占位符,再执行部署:

  1. 添加变量替换步骤:
- id: "替换deployment变量"
  name: "alpine"
  args: ["sh", "-c", "envsubst < deployment.yaml > deployment-temp.yaml"]
  env:
    - "PROJECT_ID=$PROJECT_ID"
    - "_DEPLOYMENT_TYPE=${_DEPLOYMENT_TYPE}"
    - "COMMIT_SHA=$COMMIT_SHA"
  1. 修改部署步骤的配置文件路径为替换后的临时文件:
- id: "deploy container image to GKE"
  name: "gcr.io/cloud-builders/gke-deploy"
  args: [
    "--cluster", "${_CLUSTER_NAME}",
    "run",
    "--filename", "deployment-temp.yaml",
    "--location", "${_COMPUTE_ZONE}"
  ]

内容的提问来源于stack exchange,提问作者Salad.Guyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:46