不允许使用Docker CentOS systemctl

时间:2018-10-10 09:45:59

标签: docker dockerfile centos7 systemd

我试图用systemctl命令构建一个CentOS映像。但是每次建造时。我收到此错误:

Step 5/7 : RUN systemctl enable syslog-ng ; systemctl start syslog-ng
 ---> Running in 8f5a357895e7
Failed to get D-Bus connection: Operation not permitted
The command '/bin/sh -c systemctl enable syslog-ng ; systemctl start syslog-ng' returned a non-zero code: 1

我的Dockerfile:

FROM centos_systemctl:latest 

RUN yum -y update
RUN yum -y install epel-release ; \
    yum -y install vim ; \
    yum -y install wget ; \
    yum -y install rsync ; \
    yum -y groupinstall "Development tools"
# Install syslog-ng 3.14
RUN cd /etc/yum.repos.d/ ; \
    wget https://copr.fedorainfracloud.org/coprs/czanik/syslog-ng314/repo/epel-7/czanik-syslog-ng314-epel-7.repo ; \
    yum -y install syslog-ng
RUN systemctl enable syslog-ng ; systemctl start syslog-ng
RUN yum -y remove rsyslog
# COPY config syslog-ng
CMD ["/usr/sbin/init"]

centos_systemctl:latest的依据是:https://github.com/docker-library/docs/tree/master/centos#systemd-integration

有人知道我做错了什么吗?

谢谢

3 个答案:

答案 0 :(得分:1)

您应该假设systemd和systemctl在Docker中不起作用,并找到另一种方法来实现更高级别的目标。最佳实践是仅在Docker容器中运行一项服务和一项服务,如果需要多个协调服务,则使用多个容器。如果您确实必须在同一容器中运行多个程序,那么supervisord是常见的流程管理器。

Docker中systemd的最大问题在于,默认情况下,它想要控制很多东西。看一下systemd home page上的图形:它想进行一堆内核级的设置,管理文件系统并启动多个服务,所有这些服务已经在主机上完成,而在Docker容器中则是不必要的。在Docker上运行systemd的“简便”方法涉及给它重新配置主机的权限。您提供的链接具有“硬性”方式,涉及删除其大部分控制文件。

在Dockerfile上下文中,还有一个问题,每条RUN行都从一个干净的表盘开始,根本没有任何进程在运行。因此,您的systemctl start ...命令不起作用,因为systemd初始化未运行。即使这样做,当该RUN命令完成时,该过程也会消失,并且该服务不会在下一行运行。

您可能可以通过在a prebuilt syslog-ng image上的搜索框中键入“ syslog”来找到https://hub.docker.com,这可以避免此问题。像您一样在CentOS上安装syslog-ng可能也可以工作,但是完全跳过systemd并仅以映像运行的主要命令运行服务

CMD ["syslog-ng", "-F"]

答案 1 :(得分:0)

CentOS 7和更高版本上的systemctl工具本身不会做任何事情,它只会与PID 1上的systemd守护程序通信。为此,它使用dbus连接-这就是导致错误的原因。见。

如果您真的要使用经典的sbin / init,则应先安装initscripts软件包。如果您想与实际系统的安装说明保持更高的兼容性,则可以使用无需systemd守护程序的工具替换systemctl,例如, docker-systemctl-replacement,它也作为CMD用作初始化守护程序,以正确的顺序运行所有启用的服务。

答案 2 :(得分:0)

在docker中运行真实的初始化系统很有用。它可以将所有工作从docker化中移除,日志记录可以正常工作,并且CMD始终只能是/ sbin / init。我遇到了与您相同的问题,当遵循centos的文档时,systemctl无法正常工作,并且该服务似乎也根本无法启动。

尝试忽略有关在启动容器之前删除所有系统单元的建议,如https://github.com/dholth/vagrant-docker

我想知道哪些是必需的?