如何在 Docker 容器内执行 systemctl daemon-reload?

如何在 Docker 容器内执行 systemctl daemon-reload?

最近,当我尝试在 Docker 容器内设置自定义服务(守护进程)时,我偶然发现了一个问题,但我还找不到任何可以帮助我的东西。

情况如下:我有一个文件custom.service,其中设置了服务的所有设置(顺便说一句,该服务在主机上完美运行)。然后我将服务文件移动到/etc/systemd/system/存储所有服务文件的目录。移动文件后,我必须运行命令systemctl daemon-reload将服务添加到系统服务列表(以某种方式重新索引文件夹),但这就是问题发生的地方。

显然Docker中没有systemctl,因此我无法执行所需的命令并将该服务添加到系统服务列表中。 Runningservice custom start表示custom: unrecognized service该服务未正确添加到系统中。

我很确定有人遇到了同样的问题,但谷歌还没有帮助我。也许您知道如何解决这个问题,或者也许这个命令有一些替代方案?

答案1

如果你想在容器内使用systemd单元,你需要在容器中安装systemd并确保它是第一个进程;例如,以下是如何运行由 systemd 控制的 Apache httpd:

FROM fedora:33
ENV container docker
RUN dnf -y install httpd; dnf clean all; systemctl enable httpd
STOPSIGNAL SIGRTMIN+3
EXPOSE 80
CMD [ "/sbin/init" ]

您还需要确保存在多个卷:

docker run -d --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro httpd

(假设您构建的图像名为httpd)。

在非特权容器中运行 systemd欲了解详情,或如何在容器中运行systemd使用 Podman 的更简单方法。

您可能会发现重新设计容器而不使用 systemd 单元会更简单。

相关内容