【问题标题】:RUN in Dockerfile with systemd as pid 1在 Dockerfile 中运行 systemd 作为 pid 1
【发布时间】:2021-02-08 02:27:38
【问题描述】:

是否可以在 dockerfile 中使用RUN,同时将 systemd 作为 pid 1?

我正在尝试执行一个安装脚本,该脚本需要 systemd 存在并在系统上运行,位于 dockerfile 中。即

FROM debian:stable  

RUN apt install -y systemd

RUN someInstallScriptThatRequiresSystemd.sh

【问题讨论】:

  • 即使你安排在容器中运行systemd(这通常是错误的做事方式),在docker build 阶段与之交互也没有任何意义.每个RUN 命令执行一个新进程,并且由RUN 命令启动的所有进程在继续执行Dockerfile 中的下一个命令之前都会关闭。如果您能告诉我们更多关于您的最终目标的信息,我们或许可以提出一些替代方案。
  • 我通常不会在 docker 容器中使用初始化系统。我知道大多数论点为什么这是一个坏主意。不幸的是,我对此事没有真正的发言权,因为安装脚本依赖于 systemd 在很多地方运行的事实。我现在可能会继续使用 lxc。以防万一有人关心,我正在尝试在 docker 容器中安装多用户 nixpkgs。

标签: docker systemd


【解决方案1】:

是否可以在将 systemd 设置为 pid 1 的同时在 dockerfile 中使用 RUN?

没有。每个RUN 命令通常在其自己的容器中运行,并且命令本身(或 Docker 提供的 sh -c 包装器)将是 pid 1。

还请记住,Docker 映像不包含正在运行的进程,仅包含文件系统映像和说明如何运行容器的元数据。您不能在 systemd 或其他运行的服务的情况下持久化映像,并且由于映像不包含运行服务的容器,因此在 Dockerfile 中重新启动服务是没有意义的。

Systemd 想要控制很多东西,其中大部分是容器不应该考虑的主机级别的东西。您通常根本不应该在容器中运行它;如果必须,更好的设置会删除大部分内置的系统设置任务。更好的是使用像 supervisord 这样的轻量级主管;更好的是每个容器运行一个进程,如果需要,还可以像 tini 这样的最小初始化。

如果您只需要让此安装程序运行systemctl,则可以使该“命令”存在:

RUN ln -s /bin/true /sbin/systemctl
RUN systemctl restart my-service # does nothing, successfully

【讨论】:

  • 将 systemctl 链接到真正的技巧很巧妙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2021-04-16
  • 1970-01-01
  • 2017-02-24
  • 2019-02-11
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多