Google Cloud Build多阶段Docker构建如何存储Docker生成的测试制品?
问题原因
你遇到的错误是因为Cloud Build 的工作目录(/workspace)无法直接访问 Docker 构建阶段容器内部的文件。/app/test.log 是存放在 build 阶段的容器镜像里的,Cloud Build 主机环境没有这个路径,所以找不到文件。
解决方案
有两种常用的方法可以解决这个问题,根据你的需求选择即可:
方法一:从 Docker 构建阶段镜像中复制文件到 Cloud Build 工作目录
修改 cloudbuild.yaml,先构建 build 阶段的镜像,再通过临时容器将日志文件复制到 Cloud Build 的工作目录,最后上传到 GCS:
steps: # 1. 构建 Dockerfile 中的 build 阶段镜像 - name: 'gcr.io/cloud-builders/docker' args: ['build', '--target', 'build', '-t', 'go-build-image', '.'] # 2. 从 build 阶段镜像中复制 test.log 到 Cloud Build 工作目录 - name: 'gcr.io/cloud-builders/docker' args: ['run', '--rm', '-v', '/workspace:/output', 'go-build-image', 'cp', '/app/test.log', '/output/test.log'] # 3. 上传工作目录中的 test.log 到指定 GCS 路径 artifacts: objects: location: 'gs://mybucket/test-results/' paths: ['test.log']
方法二:直接在 Cloud Build 步骤中运行测试(无需在 Dockerfile 中执行)
将 go test 步骤从 Dockerfile 移到 cloudbuild.yaml 中,让测试日志直接生成在 Cloud Build 工作目录,避免跨容器文件访问的问题:
steps: # 1. 在 Cloud Build 环境中直接运行 go test,输出日志到工作目录 - name: 'golang:1.23-alpine' entrypoint: '/bin/sh' args: ['-c', 'cd /workspace && go test -timeout 1m -v ./... > test.log'] env: ['GO111MODULE=on'] volumes: - name: 'go-mod-cache' path: '/go/pkg/mod' # 2. 构建最终的 Docker 镜像(如果需要) - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/$PROJECT_ID/hello-app', '.'] # 3. 上传测试日志到 GCS artifacts: objects: location: 'gs://mybucket/test-results/' paths: ['test.log']
内容的提问来源于stack exchange,提问作者Ayub Malik
相关产品推荐
相关产品推荐

