最近,当我尝试在 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 单元会更简单。