我有这个问题,希望在正确的地方提出,如果没有,请随时指导我。
我正在开发几个 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 上。