如何在GitLab CI单个Job中配置多个镜像?
解决方案:合并不同镜像的GitLab CI Job
GitLab CI单个Job仅支持指定一个Docker镜像,你之前尝试的多镜像写法(空格分隔/数组形式)都是不被支持的,所以得换思路实现合并,以下是三种可行方案:
方案1:使用预装Go环境的Ubuntu镜像
直接选用基于Ubuntu 20.04构建的Go官方镜像,这类镜像同时具备Go编译环境和Ubuntu系统环境,能一次性完成两个阶段的任务。
示例配置:
build_binary_and_deb: stage: build # 选用基于ubuntu20.04的Go镜像,版本可根据需求调整 image: golang:1.21-ubuntu20.04 rules: - if: '$CI_COMMIT_TAG' artifacts: untracked: true script: # 执行原build_binary的编译脚本 - echo "Some script" # 安装deb打包所需依赖(根据你的实际需求调整) - apt-get update && apt-get install -y debhelper fakeroot # 执行原build deb的打包脚本 - echo "Some script 2"
方案2:在Ubuntu镜像中手动安装Go环境
如果不想用预装镜像,可以直接在ubuntu:20.04里自行安装Go环境,再依次执行编译和打包步骤。
示例配置:
build_binary_and_deb: stage: build image: ubuntu:20.04 rules: - if: '$CI_COMMIT_TAG' artifacts: untracked: true script: # 安装Go环境(版本可自行替换) - apt-get update && apt-get install -y wget - wget https://dl.google.com/go/go1.21.0.linux-amd64.tar.gz - tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz - export PATH=$PATH:/usr/local/go/bin - go version # 验证安装成功 # 执行原build_binary的编译脚本 - echo "Some script" # 安装deb打包依赖 - apt-get install -y debhelper fakeroot # 执行原build deb的打包脚本 - echo "Some script 2"
方案3:使用Docker-in-Docker(DinD)切换镜像
通过Docker-in-Docker模式,在Job中调用Docker命令分别拉取两个镜像执行任务,此方案需要GitLab Runner开启特权模式。
示例配置:
build_binary_and_deb: stage: build image: docker:latest rules: - if: '$CI_COMMIT_TAG' # 启用DinD服务 services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 script: # 用golang镜像编译二进制,挂载当前目录同步产物 - docker run --rm -v "$(pwd)":/app -w /app golang:latest bash -c "echo 'Some script'" # 用ubuntu镜像打包deb,同样挂载目录获取产物 - docker run --rm -v "$(pwd)":/app -w /app ubuntu:20.04 bash -c "echo 'Some script 2'" artifacts: untracked: true
注意:需确保你的GitLab Runner配置中开启了privileged: true,同时要注意容器生成文件的权限问题(可能需要手动调整权限避免CI用户无法读取)。
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

