【问题标题】:Entrypoint of systemd container for Gitlab CIGitlab CI 的 systemd 容器入口点
【发布时间】: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 实例。我错了吗?

标签: docker gitlab-ci systemd


【解决方案1】:

你总是可以 fork 一个 bash shell 来完成工作,然后像这样使用 pid 1 执行 systemd:

ENTRYPOINT [ "/bin/bash", "-c", "nohup bash -c "${@} ; /sbin/init 0" & exec /sbin/init", "${@}" ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2020-01-10
    • 2021-05-02
    相关资源
    最近更新 更多