如何在GitLab CI中获取Docker镜像内Go应用生成的文件
解决GitLab CI获取Docker容器内生成的XML文件问题
方案1:构建时直接导出文件到CI主机(推荐,需Docker 17.05+)
利用Docker BuildKit的--output参数,在构建镜像的同时把容器内生成的XML文件直接导出到CI运行环境的工作目录,后续即可通过artifacts收集。
修改后的CI配置:
test: stage: checks image: docker:latest services: - docker:dind script: # 开启BuildKit确保--output参数可用 - export DOCKER_BUILDKIT=1 # 构建镜像并将容器内指定路径的文件导出到CI主机的exported_files目录 - docker build -t $serviceName -f file.qc --output type=local,dest=./exported_files . artifacts: paths: # 匹配导出的XML文件路径 - ./exported_files/build/xyz/file.xml expire_in: 1 week # 可选,设置产物过期时间,避免占用存储
方案2:通过临时容器复制文件到CI主机
如果你的Docker版本不支持--output,可以先构建镜像,再启动临时容器将文件复制到CI工作目录:
修改后的CI配置:
test: stage: checks image: docker:latest services: - docker:dind script: # 构建镜像 - docker build -t $serviceName -f file.qc . # 创建临时容器(仅用于复制文件,无需启动) - docker create --name temp_container $serviceName # 将容器内的XML文件复制到CI主机当前工作目录 - docker cp temp_container:/build/xyz/file.xml ./test_result.xml # 清理临时容器 - docker rm temp_container artifacts: paths: # 收集复制出来的文件 - ./test_result.xml expire_in: 1 week
注意事项
- 务必确认容器内的文件路径
/build/xyz/file.xml完全正确,路径错误会导致文件复制失败 - CI工作目录(即你提到的
GOPATH/src/path/to/my/repository)是artifacts默认扫描范围,只要文件被复制到该目录下的任意位置,都能被正常收集
内容的提问来源于stack exchange,提问作者sayam
相关产品推荐
相关产品推荐

