如何在GCP中用cloudbuild.yaml搭建CI/CD流水线并解决镜像拉取报错
问题解决方法
报错根因
你当前配置的第2个构建步骤直接指定了第一步才会构建的自定义镜像作为执行环境,Cloud Build默认会在启动所有构建步骤前预先拉取所有步骤用到的镜像,此时第一步还没完成镜像构建推送,拉取不存在的镜像多次重试失败就会抛出该错误。
解决方案
方案1:修改第二步的拉取策略(推荐,改动最小)
给第二个步骤添加pull: NEVER参数,强制Cloud Build使用本次构建过程中生成的本地镜像,不需要提前从远端仓库拉取:
substitutions: _DOCKER_COMPOSE_VERSION: 1.28.2 steps: - name: 'docker/compose:1.28.2' args: - 'build' - '--build-arg' - 'DOCKER_COMPOSE_VERSION=${_DOCKER_COMPOSE_VERSION}' - '-t' - 'gcr.io/$PROJECT_ID/cloudbuild-demo-dockercompose:latest' - '-t' - 'gcr.io/$PROJECT_ID/cloudbuild-demo-dockercompose:${_DOCKER_COMPOSE_VERSION}' - '.' # 第二个步骤新增pull: NEVER配置 - name: 'gcr.io/$PROJECT_ID/cloudbuild-demo-dockercompose' pull: NEVER args: ['version'] images: - 'gcr.io/$PROJECT_ID/cloudbuild-demo-dockercompose:latest' - 'gcr.io/$PROJECT_ID/cloudbuild-demo-dockercompose:${_DOCKER_COMPOSE_VERSION}' tags: ['cloud-builders-community']
方案2:拆分构建和验证流程
如果需要从远端拉取镜像验证,可以把构建推送镜像和验证拆成两个独立的构建任务,第一个任务完成镜像推送后再触发第二个验证任务。
额外权限排查
如果修改配置后还是报错,需要确认Cloud Build默认服务账号的权限:
- Cloud Build默认服务账号格式为
[项目编号]@cloudbuild.gserviceaccount.com,可在Cloud Build控制台查看对应账号 - 给该账号授予对应镜像仓库的读写权限,GCR场景授予镜像关联存储桶的
roles/storage.objectAdmin权限,Artifact Registry场景授予roles/artifactregistry.writer权限
内容的提问来源于stack exchange,提问作者Penguen
相关产品推荐
相关产品推荐

