1

我目前正在尝试启用一个启用 systemd 的 CentOS 容器,以便用作 Concourse 任务的环境。相关的管道正在构建安装由 systemd 管理的服务的 RPM 包,我希望在尽可能接近预期用例的环境下运行测试。我的容器基于CentOS Docker Hub 镜像描述中关于在 CentOS 容器中使用 systemd 的简短手册。

我不是 100% 确定决定性问题是什么,但它似乎与以下情况之一有关(我不确定这些情况是否全部或仅部分需要修复/解决方法):

  1. 似乎不可能将主机(或者更确切地说是 Concourse 工作人员的,因为它在 Docker 中使用 Docker)cgroup 文件系统正确绑定挂载到 CentOS 容器中,因为 Concourse 没有为任务绑定挂载的配置。我试图在容器内“从头开始”生成必要的文件系统,安装一个 tmpfs /sys/fs/cgroup,然后安装一个名为systemdon的 cgroup 文件系统/sys/fs/cgroup/systemd,但我不确定这是否应该工作。
  2. 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成功运行,但一直未能成功。我尝试过的配置以及我收到的错误是:

  1. /usr/sbin/init无论是否从头开始挂载 systemd cgroup,无论是否运行命令,都会导致exec错误Couldn't find an alternative telinit implementation to spawn.
  2. /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
  3. 在按照描述安装 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

4

0 回答 0