现在Ubuntu 22.04发布了,我在我们的一个jenkins工作人员身上做了一个干净的安装来测试它,但我无法让docker ssh代理正常工作。它不再能够识别它在容器内运行,所以每当启动使用docker的作业时,我都可以在控制台中看到";Jenkins-worker-X似乎没有在容器内运行";,随后管道发生故障。
我以前就知道jenkins使用cgroup信息来检测它是否在容器中运行,所以例如,在容器中执行cat /proc/self/cgroup
应该会产生一个以/docker/<container-id>
结尾的行列表,然后jenkins使用它来检测容器。然而,一旦我安装了Ubuntu 22.04,cgroup信息就不再包含/docker/<container-id>
,这会导致jenkins代理认为它在裸机上运行。
即使执行官方映像也有同样的问题,即docker run jenkins/ssh-agent:jdk11
后面跟着docker exec <container-id> cat /proc/self/cgroup
,最终在我的机器上得到一个没有容器哈希的列表。
如何对此进行故障排除?从Ubuntu 21.10到22.04有什么变化导致了这个问题吗?是否需要一些额外的配置?
我运行的是最新的Ubuntu 22.04(5.15.0-27-generic),Docker版本20.10.12,版本20.10.12-0ubuntu4。
任何帮助都将不胜感激!
编辑:我现在意识到,如果你将所有软件包升级到最新版本(并使用最新的jenkins/ssh代理映像),21.10中也会发生同样的事情,所以原因可能在其中一个升级的软件包中
事实证明,这个问题毕竟与cgroup v2有关。似乎在使用v2时,在创建容器时,cgroup命名空间在默认情况下是私有的,在我的例子中是Jenkins代理,这导致容器id在/proc/self/cgroup
中不可用。
简单的解决方案是使用--cgroupns host
运行docker容器,如这里的另一个问题中所建议的。当我这样做的时候,詹金斯可以再次检测到它在里面运行的容器。
Ubuntu 21.10可能发布了一个更新,切换到cgroup v2,就像我发布这个问题一样,因为我以后也可以在那里重现这个问题。
如果使用Docker Compose运行Jenkins容器,则可以在Compose文件中提供另一个答案中提到的cgroup
参数:https://docs.docker.com/compose/compose-file/05-services/#cgroup
或者,如果您可以控制运行Jenkins的Docker守护进程,则可以将Docker守护程序配置中的default-cgroupns-mode
标志设置为host
。请注意,这将适用于主机上的所有容器。