我试图用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
有人知道我做错了什么吗?
谢谢
答案 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
我想知道哪些是必需的?