Cloud Build构建带commit哈希镜像,Container OS VM拉取latest报错如何解决
问题原因
- 你手动创建Container OS虚拟机时,配置部署的容器镜像未指定标签,GCE的konlet容器启动代理默认会使用
latest标签拉取镜像。但你当前的Cloud Build配置仅为镜像绑定了commit哈希标签,没有构建并推送latest标签的镜像,因此拉取时触发找不到镜像的报错。 - 你当前的Cloud Build流程仅完成了Cloud Run服务的更新,没有添加更新虚拟机容器配置的步骤,即使镜像存在也无法实现代码推送后自动同步到VM的需求。
修复方案
方案一:新增latest标签适配现有VM配置(操作最简单)
修改你的cloudbuild.yaml,在构建和推送镜像时同时生成commit哈希和latest两个标签,适配VM默认的拉取规则:
steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA', '-t', 'gcr.io/$PROJECT_ID/$IMAGE:latest', './folder_name'] - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA'] - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/$PROJECT_ID/$IMAGE:latest'] - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: - 'run' - 'deploy' - 'run-public-email' - '--image' - 'gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA' - '--region' - 'us-central1' # 新增更新VM容器配置的步骤,替换为你自己的VM可用区和VM名称 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: - 'compute' - 'instances' - 'update-container' - '你的VM名称' - '--zone' - '你的VM可用区,比如us-central1-a' - '--container-image' - 'gcr.io/$PROJECT_ID/$IMAGE:latest' images: - 'gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA' - 'gcr.io/$PROJECT_ID/$IMAGE:latest'
配置完成后需要给Cloud Build默认服务账号授予虚拟机编辑权限:在IAM页面找到[项目号]@cloudbuild.gserviceaccount.com账号,添加「Compute Instance Admin (v1)」角色即可。
方案二:不使用latest标签,直接指定commit哈希更新VM
如果需要避免latest标签可能带来的版本混淆问题,可以直接在更新VM的步骤中传入本次构建的commit哈希标签:
# 仅需替换上方方案中的VM更新步骤即可 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: - 'compute' - 'instances' - 'update-container' - '你的VM名称' - '--zone' - '你的VM可用区' - '--container-image' - 'gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA'
使用该方案需要先手动更新一次VM的初始配置,避免首次启动时拉取latest标签失败:执行gcloud compute instances update-container 你的VM名称 --zone 你的可用区 --container-image gcr.io/$PROJECT_ID/$IMAGE:$COMMIT_SHA 完成首次配置即可。
内容的提问来源于stack exchange,提问作者S68
相关产品推荐
相关产品推荐

