Gitlab CI中服务容器与Runner容器如何共享卷或目录
GitLab CI 服务容器与作业容器文件共享方案
方案1:全局配置Runner实现自动卷挂载(官方原生支持)
之前在config.toml中配置volumes参数对服务容器不生效,是因为普通[runners.docker]段下的volumes配置默认仅挂载到主作业容器。GitLab Runner 14.2及以上版本已经提供了专门针对服务容器的卷挂载配置项,配置后即可实现主作业容器、所有服务容器、宿主机三者的目录共享:
- 打开Runner对应的
config.toml配置文件 - 在对应Runner的docker配置段下,添加
services_volumes配置:
[runners.docker] # 原有配置(镜像、特权模式、普通volumes等)保持不变 # 新增服务容器专属卷配置 [[runners.docker.services_volumes]] host_path = "/data/ci-shared" # 宿主机上的真实目录路径 container_path = "/ci-shared" # 所有容器内的统一挂载路径 mode = "rw" # 权限配置,rw为可读写,ro为只读
- 重启Runner服务使配置生效
配置生效后,同个作业下的主作业容器、所有启动的服务容器都会自动挂载该目录:服务容器生成的文件写入/ci-shared路径后,主作业容器、其他服务容器都可以直接在同路径下读取,不需要额外复制操作。
注意:宿主机上的共享目录需要提前给Runner运行用户分配读写权限,避免容器内写入时报权限拒绝错误。
方案2:无Runner配置权限时的轻量网络传输方案
如果没有权限修改Runner全局配置,可以利用GitLab CI默认的容器组网规则实现文件传输,不需要手动进入服务容器执行复制命令:
- GitLab CI启动的主作业容器和所有服务容器默认在同一个内部桥接网络下,容器间可以直接通过网络互通
- 作业启动时先在主作业容器后台启动一个简易HTTP文件接收服务,示例:
# 以Python为例,启动后监听8000端口,接收上传的文件存放到指定目录 python3 -m uploadserver 8000 -d /builds/output &
- 配置服务容器(比如selenium)在生成目标文件后,直接通过HTTP请求把文件上传到主作业容器的8000端口即可,主作业容器的访问地址可以直接用作业容器的默认网络别名,不需要手动查询容器IP。
常见误区说明
之前看到的开放状态功能诉求issue均为14.2版本之前的历史讨论,目前官方已经原生支持服务容器卷挂载能力,不需要依赖docker-in-docker或者docker-compose方案。
内容的提问来源于stack exchange,提问作者Kagetsuki
相关产品推荐
相关产品推荐

