我目前正在尝试启用一个启用 systemd 的 CentOS 容器,以便用作 Concourse 任务的环境。相关的管道正在构建安装由 systemd 管理的服务的 RPM 包,我希望在尽可能接近预期用例的环境下运行测试。我的容器基于CentOS Docker Hub 镜像描述中关于在 CentOS 容器中使用 systemd 的简短手册。
我不是 100% 确定决定性问题是什么,但它似乎与以下情况之一有关(我不确定这些情况是否全部或仅部分需要修复/解决方法):
- 似乎不可能将主机(或者更确切地说是 Concourse 工作人员的,因为它在 Docker 中使用 Docker)cgroup 文件系统正确绑定挂载到 CentOS 容器中,因为 Concourse 没有为任务绑定挂载的配置。我试图在容器内“从头开始”生成必要的文件系统,安装一个 tmpfs
/sys/fs/cgroup
,然后安装一个名为systemd
on的 cgroup 文件系统/sys/fs/cgroup/systemd
,但我不确定这是否应该工作。 - Concourse 使用挂载的
garden-init
二进制文件作为镜像入口点和 PID 1,这导致 systemd 在不同的 PID 下运行。根据 CentOS 手册,入口点应该是/usr/sbin/init
,这是一个符号链接/usr/lib/systemd/systemd
虽然这应该可以使用--system
标志,但我仍然无法让一切完全正常工作。
我尝试了不同的任务配置(通过特权运行fly execute
,命令通过 执行bash -exc <command>
),目的是能够systemctl is-system-running
成功运行,但一直未能成功。我尝试过的配置以及我收到的错误是:
/usr/sbin/init
无论是否从头开始挂载 systemd cgroup,无论是否运行命令,都会导致exec
错误Couldn't find an alternative telinit implementation to spawn.
。/usr/lib/systemd/systemd --system
在没有从头开始安装 systemd cgroup 的情况下运行导致 systemd 无法启动并显示错误消息
Cannot find cgroup mount point: No such file or directory
Failed to allocate manager object: No such file or directory
- 在按照描述安装 systemd cgroup 后运行
/usr/lib/systemd/systemd --system
会导致 systemd 显然正确启动(输出与根据 CentOS 文档在 Concourse 之外运行所有内容时的输出相同),但运行systemctl is-system-running
会导致错误Failed to get D-Bus connection: Operation not permitted
。
我确实设法通过复制通过 Concourse/Garden 创建的容器包并仅将入口点(或者更确切地说是 OCI config.jsonsystemctl is-system-running
的字段)编辑为 来在手动创建的 runc 容器中工作,所以看起来这就足够了满足我的要求。不幸的是,我不知道如何配置我的管道来为从 Concourse 上下文启动的容器实现这一点。process.args
/usr/sbin/init