Docker jenkins ssh-agent "not running inside container" on Ubuntu 22.04



现在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。请注意,这将适用于主机上的所有容器。

最新更新