MacOS 上带有 systemd 的 Rocky Linux 容器

MacOS 上带有 systemd 的 Rocky Linux 容器

我有这个问题,希望在正确的地方提出,如果没有,请随时指导我。

我正在开发几个 Ansible 角色并使用分子作为测试角色的工具。 Molecule 依次使用容器来测试角色。

我专门为基于 RHEL 8 的操作系统开发我的角色。我选择使用 Rocky Linux 作为容器的操作系统,因为这是最接近 RHEL 的操作系统之一。

在角色中,有使用/利用 systemd 执行的任务。但是,容器默认没有可用的 systemd。有一些“解决方法”可以真正使 systemd 可用于容器,这是我的目标。

因此,我创建了一个在 Rocky Linux 容器中构建 systemd 的容器,遵循这个 Dockerfile

我构建了容器,并尝试启动它。

$ docker build -t my_test .
[+] Building 1.4s (6/6) FINISHED
...

然后,我尝试运行该容器,但它提供了一个错误。

$ docker run --tty --privileged --volume /sys/fs/cgroup:/sys/fs/cgroup:ro my_test
Failed to insert module 'autofs4': No such file or directory
systemd 239 (239-51.el8) running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)
Detected virtualization docker.
Detected architecture x86-64.

Welcome to Rocky Linux 8.5 (Green Obsidian)!

Set hostname to <dea75c1001fd>.
Initializing machine ID from random generator.
Failed to create /init.scope control group: Read-only file system
Failed to allocate manager object: Read-only file system
[!!!!!!] Failed to allocate manager object, freezing.
Freezing execution.

问题:如何在 Rocky Linux 容器上成功构建一个具有 systemd 的容器?

信息:MacOS 10.15.7,Docker 版本 20.10.11,内部版本 dea9396

答案1

如果您想拥有systemd内部容器并且正在systemd启用的系统上运行,为什么要为外星人和非标准垃圾而烦恼docker

所有最新的systemd系统都systemd-nspawnd原生支持容器: https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html

这些容器将systemd在本机内部运行,并且几乎所有功能都可以工作,包括服务管理和其他东西。这种类型的容器也不依赖于笨重的docker集线器愚蠢,因此您可以轻松地在内部安装内核支持的任何操作系统。

事实上,nspawnd 容器的行为更像是 freebsd 监狱或真正的虚拟机,而不是某些docker东西。在您的用例中,这非常有意义。

编辑:

抱歉,我没有注意到您使用的是 MacOS。

我已经有一段时间在处理 MacOS 了,我很确定他们的 Linux 模拟是不存在的,即使是相反的情况,你也肯定无法成功地将这个内核模块加载到完全不同的系统架构中:

Failed to insert module 'autofs4': No such file or directory

几年前我听说过一些用 go 编写的用户模式 ​​Linux 内核模拟研究,但我不完全确定是否docker能够处理这个问题。

简而言之,您在完成特定工作时使用了错误的工具。

正确的方法是运行轻量级虚拟机并在其中运行 systemd。然后,您可以在心理上将该虚拟机视为容器,毕竟这并不重要。

如果您确实需要运行一些特定于 Linux 的容器化引擎来测试您的用例,请构建一个小型 centors/rhel/rocky VM 并将容器化框架安装到其中(nspawn默认情况下存在)。

答案2

下面是一个让 systemd 在 MacOS 上的 docker 容器中工作的示例,使用文件docker-compose.yml来挂载/sys/fs/cgroup卷和必要的tmpfs目录:

https://github.com/moby/moby/issues/30723#issuecomment-365927679

通过将以下内容添加到其 docker-compose 文件中:

    privileged: true
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    tmpfs:
      - /run
      - /run/lock
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro

在该问题线程的其他地方,解释了 Mac 上的 docker 使用自己的 Linux 虚拟机,因此容器会挂载它,并且/sys/fs/cgroup不需要存在于您的 Mac 上。

相关内容