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

如何删除Google Cloud Run中除活跃版本外的所有容器镜像旧版本?

如何删除Google Cloud Run中除活跃版本外的所有容器镜像旧版本?

我来帮你一步步搞定这个成本优化需求,毕竟清理Cloud Run的旧镜像和冗余修订版本确实是个实用操作~结合你用GitLab流水线Job处理凭据的场景,咱们可以这么做:

核心思路

先定位当前服务活跃修订版本对应的镜像,再找出所有非活跃修订版本关联的镜像,最后批量删除这些旧镜像(顺带也可以删掉没用的修订版本本身,避免冗余)。

具体操作步骤

1. 提前准备环境变量

在你的GitLab Job里,除了已有的GCP_REGION,记得补充服务名称的环境变量:

export SERVICE_NAME="你的Cloud Run服务名称"

2. 获取活跃修订版本的镜像地址

如果你的服务只有一个接收流量的活跃版本,用这条命令拿到它的镜像:

ACTIVE_IMAGE=$(gcloud run services describe "$SERVICE_NAME" --region="$GCP_REGION" --format='value(status.traffic.latestRevision.image)')

如果你的服务是流量拆分到多个版本(比如多个活跃修订),可以改成获取所有有流量的版本镜像:

ACTIVE_IMAGES=$(gcloud run services describe "$SERVICE_NAME" --region="$GCP_REGION" --format='value(status.traffic.image)' | tr '\n' ' ')

3. 列出所有非活跃修订版本

筛选出没有流量分配的修订版本(也就是非活跃的):

INACTIVE_REVISIONS=$(gcloud run revisions list --region="$GCP_REGION" --service="$SERVICE_NAME" --format='value(metadata.name)' --filter='status.trafficPercent=0')

4. 批量删除非活跃镜像和修订版本

循环处理每个非活跃修订,先拿到它对应的镜像并删除,再删掉修订版本本身:

for REVISION in $INACTIVE_REVISIONS; do
  # 获取当前修订版本的镜像地址
  REVISION_IMAGE=$(gcloud run revisions describe "$REVISION" --region="$GCP_REGION" --format='value(spec.template.spec.containers[0].image)')
  
  # 跳过活跃镜像(防止误删)
  if [[ "$ACTIVE_IMAGES" != *"$REVISION_IMAGE"* ]]; then
    # 删除镜像(--quiet参数用于GitLab非交互式环境自动确认)
    gcloud container images delete "$REVISION_IMAGE" --quiet
    # 删除非活跃修订版本
    gcloud run revisions delete "$REVISION" --region="$GCP_REGION" --quiet
  fi
done

注意事项

  • 确保你的GitLab Job已经正确配置了GCP认证(比如通过Service Account密钥文件,设置GOOGLE_APPLICATION_CREDENTIALS环境变量),否则gcloud命令会有权限问题。
  • 测试阶段可以先去掉--quiet参数,手动确认要删除的内容,避免误删重要镜像。
  • 如果你的镜像标签是自定义的(不是用Cloud Run自动生成的digest),要确保筛选逻辑不会误删同标签但不同digest的镜像(不过用revision关联的镜像地址是带digest的,所以一般没问题)。

备注:内容来源于stack exchange,提问作者Bengt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:57:34