Google Cloud Build使用POM版本标记Docker镜像推送失败求助
问题描述
我的Google Cloud Build需要完成以下操作:
- 构建Maven项目
- 通过Maven插件构建Docker镜像
- 重新标记Docker镜像,使其符合Google Cloud Artifact Registry的命名规范
- 将镜像推送至Artifact Registry
我想把POM版本作为镜像标签的后缀,通过Maven目标提取版本。尝试按照文档建议把版本写入文件后,在images字段里用$(cat /workspace/version.txt)读取时触发构建失败,提示镜像名称解析错误。
当前构建配置:
steps: - name: 'maven:3.9.1' id: Extract project version from pom args: - '-c' - > mvn help:evaluate -Dexpression=project.version -q -DforceStdout > /workspace/version.txt entrypoint: bash - name: 'maven:3.9.1' args: - '-c' - > mvn -version mvn clean install -DskipTests mvn -B -f ./my-module/pom.xml org.springframework.boot:spring-boot-maven-plugin:build-image -DskipTests id: Build all applications and create docker images entrypoint: bash - name: gcr.io/cloud-builders/docker id: Retag my module image entrypoint: bash args: - - '-c' - > docker tag my-module:$(cat /workspace/version.txt) europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$(cat /workspace/version.txt) - name: gcr.io/cloud-builders/docker args: - image - list images: - >- europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$(cat /workspace/version.txt)
触发构建时的错误:
Failed to trigger build: invalid build: invalid image name "europe-west4-docker.pkg.dev/my-project/my-repo/my-module:$(cat /workspace/version.txt)": could not parse reference: europe-west4-docker.pkg.dev/my-project/my-repo/my-module:$(cat /workspace/version.txt)
最新构建日志:
starting build "21bf9cc4-a3b2-4fa5-9f4a-227251418f69" FETCHSOURCE hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /workspace/.git/ From https://github.com/***************************************** * branch c67f9196c83cb979375e56c20fdf1b74c000b6fb -> FETCH_HEAD HEAD is now at c67f919 up the pom BUILD Starting Step #0 - "Extract project version from pom" Step #0 - "Extract project version from pom": Pulling image: maven:3.9.1 Step #0 - "Extract project version from pom": 3.9.1: Pulling from library/maven Step #0 - "Extract project version from pom": 1bc677758ad7: Already exists Step #0 - "Extract project version from pom": 0d0e0ecb256a: Already exists Step #0 - "Extract project version from pom": f2771a8876bc: Already exists Step #0 - "Extract project version from pom": b345cc3cb9aa: Already exists Step #0 - "Extract project version from pom": cbe2c70538c6: Already exists Step #0 - "Extract project version from pom": 2dfc9d99b05b: Already exists Step #0 - "Extract project version from pom": cfed619e8a87: Already exists Step #0 - "Extract project version from pom": 26665a7643b2: Already exists Step #0 - "Extract project version from pom": e5e3e15e6256: Already exists Step #0 - "Extract project version from pom": Digest: sha256:2dee414ad9997352b313031ce3ef2c10b119a333fba743f456ec4b1915081173 Step #0 - "Extract project version from pom": Status: Downloaded newer image for maven:3.9.1 Step #0 - "Extract project version from pom": docker.io/library/maven:3.9.1 Finished Step #0 - "Extract project version from pom" Starting Step #1 - "Build all applications and create docker images" Step #1 - "Build all applications and create docker images": Already have image (with digest): maven:3.9.1 Step #1 - "Build all applications and create docker images": 0.0.0.0 Finished Step #1 - "Build all applications and create docker images" PUSH DONE
问题原因
Cloud Build的顶层images字段是在构建初始化阶段就被解析的,此时还没有执行任何构建步骤,/workspace/version.txt文件根本不存在,所以无法解析$(cat /workspace/version.txt)这个命令替换,直接把它当成了标签的一部分,导致镜像名称格式错误。
解决方案
去掉顶层的images字段,改用docker push命令在构建步骤里完成推送,这样就能读取到之前步骤生成的版本文件。同时修复Retag步骤里的参数错误(多了一个多余的-)。
修改后的完整配置:
steps: - name: 'maven:3.9.1' id: Extract project version from pom args: - '-c' - > mvn help:evaluate -Dexpression=project.version -q -DforceStdout > /workspace/version.txt entrypoint: bash - name: 'maven:3.9.1' args: - '-c' - > mvn -version && mvn clean install -DskipTests && mvn -B -f ./my-module/pom.xml org.springframework.boot:spring-boot-maven-plugin:build-image -DskipTests id: Build all applications and create docker images entrypoint: bash - name: gcr.io/cloud-builders/docker id: Retag my module image entrypoint: bash args: - '-c' - > VERSION=$(cat /workspace/version.txt) && docker tag my-module:$VERSION europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$VERSION - name: gcr.io/cloud-builders/docker id: Push my module image to Artifact Registry entrypoint: bash args: - '-c' - > VERSION=$(cat /workspace/version.txt) && docker push europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$VERSION - name: gcr.io/cloud-builders/docker args: - image - list
关键调整说明
- 移除顶层
images字段:避免初始化阶段的解析错误,改用步骤内的docker push完成推送。 - 修复Retag步骤的参数:原配置里
args的第一个元素是- - '-c',多了一个多余的-,改为'-c'。 - 提取版本到变量复用:在Retag和Push步骤里把版本读取到
VERSION变量,避免重复执行cat命令,提升可读性。 - 合并构建步骤的命令:用
&&连接多个Maven命令,确保前一个命令执行成功才会继续下一个,避免某个命令失败后后续步骤仍执行。
内容的提问来源于stack exchange,提问作者Dimitris
相关产品推荐
相关产品推荐

