Cloud Build未推送Repo2的Docker镜像至Artifact Registry问题求助
Cloud Build镜像推送异常排查(Repo2无法推送至Artifact Registry)
我在同一GCP项目下,使用相同的服务账号、GitHub账号配置了两个Cloud Build触发器(对应Repo1和Repo2),Artifact Registry中也分别创建了对应仓库。Repo1的Docker镜像可正常推送到Artifact Registry,但Repo2的镜像始终未出现在对应仓库中,且Repo2的构建日志无报错信息,仅停留在打标签阶段:
Step #0: Successfully built 4c46XXXX Step #0: Successfully tagged us-docker.pkg.dev/my-project/repo2/main:latest Finished Step #0
对比Repo1的构建日志,包含完整的镜像推送步骤:
Successfully built XXXXX Successfully tagged us-docker.pkg.dev/my-project/repo1/repo1:latest PUSH Pushing us-docker.pkg.dev/my-project/repo1/repo1 The push refers to repository [us-docker.pkg.dev/my-project/repo1/main] ... XXX: Layer already exists XXX: Pushed latest: digest: sha256:XXXXXX DONE
Repo1的cloudbuild.yaml配置
steps: - name: gcr.io/cloud-builders/docker args: [build, -t, $_GCR/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME, "."] images: [$_GCR/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME] options: logging: CLOUD_LOGGING_ONLY substitutions: _GCR: us-docker.pkg.dev
注:$REPO_NAME为"repo1",对应的Artifact Registry路径为
us-docker.pkg.dev/my-project/repo1,推送已确认成功。
Repo2的cloudbuild.yaml配置
steps: - name: gcr.io/cloud-builders/docker args: [ build, -t, us-docker.pkg.dev/$PROJECT_ID/$_SERVICE_NAME/$BRANCH_NAME, -f, Dockerfile, ".", ] id: Build service - name: gcr.io/cloud-builders/docker entrypoint: docker args: [ run, SERVICE_NAME=$_SERVICE_NAME, $_VM_CLEANUP_IMAGE, ] id: Deleting oldest VM for service tags: [$COMMIT_SHA, $TRIGGER_NAME] images: [us-docker.pkg.dev/$PROJECT_ID/$_SERVICE_NAME/$BRANCH_NAME] options: logging: CLOUD_LOGGING_ONLY substitutions: _SERVICE_NAME: "repo2"
Rep2对应的Artifact Registry路径为
us-docker.pkg.dev/my-project/repo2,当前为空。
已做排查操作
- 权限检查:两个触发器使用相同服务账号,未发现权限相关报错或提示
- 查阅Cloud Build官方故障排查文档、部署文档,以及社区常见的镜像推送失败问题案例
可能原因及解决步骤
- YAML语法错误导致构建提前终止
Rep2的cloudbuild.yaml中第二个步骤的id字段缩进错误——它应与name、entrypoint同级,当前写法会被解析为上一个步骤的属性,导致YAML格式异常,Cloud Build可能在执行完第一个步骤后就终止,跳过了镜像推送环节。
修正后的第二个步骤代码:
- name: gcr.io/cloud-builders/docker
entrypoint: docker
args:
[
run,
SERVICE_NAME=$_SERVICE_NAME,
$_VM_CLEANUP_IMAGE,
]
id: Deleting oldest VM for service
注意`id`需与`name`对齐,属于第二个步骤的独立属性。 2. **第二个步骤执行失败但日志未完整输出** 虽然日志显示无报错,但第二个步骤的`docker run`命令可能存在执行失败的情况(比如`$_VM_CLEANUP_IMAGE`不存在、参数配置错误),而`logging: CLOUD_LOGGING_ONLY`可能未捕获完整错误信息。可临时修改日志配置为`GCS_ONLY`或`LEGACY`,查看完整构建日志确认第二个步骤的执行状态。 3. **镜像标签路径校验** 确认`us-docker.pkg.dev/$PROJECT_ID/$_SERVICE_NAME/$BRANCH_NAME`与Artifact Registry仓库路径完全匹配:Repo2的仓库路径为`us-docker.pkg.dev/my-project/repo2`,若`$BRANCH_NAME`为`main`,则镜像标签应为`us-docker.pkg.dev/my-project/repo2/main:latest`,该路径本身是合法的,需确保构建能执行到推送环节。 内容的提问来源于stack exchange,提问作者engineer-x
相关产品推荐
相关产品推荐

