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

Google托管VM实例组创建/替换时无法获取最新镜像问题

问题诊断与解决方案

你的问题核心是Cloud Build流程的时序错误:当前配置中,镜像推送操作是在所有steps执行完成后才触发的,但你在第二个step就执行了实例组滚动替换。这时候新构建的镜像还没上传到GCR,实例拉取的还是旧版本镜像。等Cloud Build跑完完成镜像推送后,手动再触发一次触发器,此时新镜像已经存在,替换才会生效,所以出现了“滞后一个版本”的现象。

修复方案:调整镜像推送时机

修改Cloud Build配置,在steps中手动完成镜像推送,确保新镜像上传完成后再执行滚动替换:

steps:
- name: gcr.io/cloud-builders/docker
  args: [ build, -t, gcr.io/$PROJECT_ID/$_APP_NAME, . ]
# 新增手动推送步骤,确保镜像上传完成后再执行替换
- name: gcr.io/cloud-builders/docker
  args: [ push, gcr.io/$PROJECT_ID/$_APP_NAME ]
- name: gcr.io/cloud-builders/gcloud
  args: [ compute, instance-groups, managed, rolling-action, replace, $_INSTANCE_GROUP_NAME, --region=$_INSTANCE_GROUP_REGION, --max-unavailable=0, --max-surge=3 ]

# 可选:保留images字段不影响,也可以删除
images:
- gcr.io/$PROJECT_ID/$_APP_NAME

额外优化:避免标签覆盖的缓存问题

如果希望彻底避免镜像标签覆盖导致的缓存或同步问题,可以给每个构建的镜像添加唯一标签(比如Git提交哈希),同时更新实例模板使用该标签后再执行替换:

steps:
- name: gcr.io/cloud-builders/docker
  args: [ build, -t, gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA, . ]
- name: gcr.io/cloud-builders/docker
  args: [ push, gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA ]
# 更新实例模板,使用最新构建的镜像
- name: gcr.io/cloud-builders/gcloud
  args: [ compute, instance-templates, set-disk, $_INSTANCE_TEMPLATE_NAME, --disk, name=YOUR_DISK_NAME, source-image=gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA, --region=$_INSTANCE_GROUP_REGION ]
# 执行滚动替换
- name: gcr.io/cloud-builders/gcloud
  args: [ compute, instance-groups, managed, rolling-action, replace, $_INSTANCE_GROUP_NAME, --region=$_INSTANCE_GROUP_REGION, --max-unavailable=0, --max-surge=3 ]

images:
- gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA

注意:需要将$_INSTANCE_TEMPLATE_NAME替换为你的实例模板名称,YOUR_DISK_NAME替换为模板中对应的磁盘名称。

补充说明

你之前添加的sleep 60无效,是因为镜像推送根本还没开始——Cloud Build的images字段推送操作是在所有steps执行完毕后才进行的,无论sleep多久,执行替换时新镜像都还没上传到GCR,所以无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:02:17