GitLab CI容器内测试异常:脚本未运行于Docker环境
我原本在GitLab CI里执行测试任务时,是先构建Docker镜像,再在脚本里启动容器运行测试。后来发现可以直接通过image参数指定镜像来启动测试,但运行cat /proc/1/cgroup查看后,发现脚本根本没实际跑在Docker容器环境里。
我的CI配置如下:
test_end_to_end: stage: test image: my-image tags: - end-to-end-ci script: - cat /proc/1/cgroup
问题分析与解决思路
这种情况大概率是你指定的end-to-end-ci标签对应的GitLab Runner用的是Shell执行器(shell executor),而不是Docker执行器。
Shell执行器的工作方式是直接在Runner所在的主机系统上执行脚本,完全不会启动Docker容器——哪怕你在job里配置了image参数,这个参数在Shell执行器下是被忽略的。这时候/proc/1/cgroup显示的自然是主机系统的cgroup信息,而非容器的。
具体排查与解决步骤
检查Runner的执行器类型
登录GitLab找到对应Runner的详情页面,就能看到它的执行器类型;或者直接登录Runner所在主机,查看/etc/gitlab-runner/config.toml文件,找到对应Runner配置段里的executor字段,看值是不是shell。切换到Docker执行器
如果可以修改现有Runner配置,把executor改成docker(或者docker+machine,适合需要动态扩容的场景),同时确保Runner主机已经正确安装并配置了Docker环境;如果不能修改现有Runner,就新增一个用Docker执行器的Runner,给它打上end-to-end-ci标签,让测试job调度到这个新Runner上。验证修复效果
修改完成后重新触发测试job,再查看/proc/1/cgroup的输出,应该能看到包含Docker容器ID的cgroup路径,这就说明脚本已经在指定的my-image容器里运行了。
内容的提问来源于stack exchange,提问作者Maxime Blanc

