【发布时间】:2022-12-30 09:10:33
【问题描述】:
我正在构建一个用于运行 Gitlab CI 作业的 docker 镜像。其中一个组件需要 systemd 启动并在容器内运行,这不是微不足道的,但网上有几个指南,所以我设法做到了。该过程的一部分需要在 Dockerfile 中定义此入口点:
ENTRYPOINT ["/usr/sbin/init"]
以便 systemd 根据需要在容器中作为 PID 1 运行。这似乎与 Gitlab CI 要求冲突:据我了解,gitlab-runner 会覆盖 Dockerfile 的 CMD 以生成一个 shell,然后执行 CI 脚本。但是 /usr/sbin/init 入口点无法理解 Gitlab 的 CMD,因此不会生成 shell 并且执行会停止。
我不知道如何解决这个问题:
- 执行启动 /usr/sbin/init 的入口点脚本,然后 shell 将无法工作,因为 systemd 不是 PID1;
- 使用 shell 作为 ENTRYPOINT,然后使用 systemd 作为 CMD 将不起作用,因为 Gitlab CI 覆盖了 CMD。
我想不出任何其他可能的解决方案,因此非常感谢您的帮助。
【问题讨论】:
-
如果 systemd 不是 PID1 也没关系。
-
如果我不在 ENTRYPOINT 中启动 /usr/sbin/init 但例如在用作 ENTRYPOINT 的脚本中然后我得到:“无法获得 D-Bus 连接:不允许操作”每次启动 systemctl 时,例如
systemctl list-units返回该错误。 -
@sytech 我调查了一下,我认为你指的是 systemd 的用户模式:据我所知,它仅在系统已使用 systemd 启动时才有效,即是否存在 PID 为 1 的全局 systemd 实例。我错了吗?