当前位置: 首页 > 知识库问答 >
问题:

不允许Docker CentOS systemctl

石正卿
2023-03-14

我尝试使用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\u systemctl:最新版本:https://github.com/docker-library/docs/tree/master/centos#systemd-集成

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

谢谢

共有3个答案

章建木
2023-03-14

在docker中运行真正的init系统很有用。它完成了Dockenization的所有工作,日志正常工作,CMD始终可以是/sbin/init。我和你有同样的问题,systemctl不工作,而且在遵循centos的文档时,服务似乎根本没有启动。

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

我想知道需要哪些?

鞠乐
2023-03-14

CentOS 7及更高版本上的systemctl工具本身不会做任何事情,它只会与PID 1上的systemd守护程序对话。它为此使用dbus连接-这就是您看到的错误的原因。

如果您真的想使用经典的sbin/init,那么您应该先安装initscripts包。如果您想与真实系统的安装说明保持更大的兼容性,那么您可以使用一个在没有systemd守护进程的情况下工作的工具来替换als,例如docker systemctl replacement,它也可以作为CMD,作为按正确顺序运行所有已启用服务的init守护进程。

施琦
2023-03-14

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

Docker中systemd的最大问题是,默认情况下,它想要控制很多事情。看看systemd主页上的图:它想做一些内核级的设置,管理文件系统,并启动几个服务,所有这些都已经在主机上完成了,在Docker容器中是不必要的。在Docker中运行systemd的“简单”方法包括允许它重新配置主机;您提供的链接有一种“硬”方式,即删除其大多数控制文件。

在Dockerfile上下文中,还有一个问题,即每个RUN行都是从一个干净的石板开始的,根本没有进程运行。因此,您的systemctl start...命令不起作用,因为systemd init没有运行;即使它运行了,当RUN命令完成时,进程将消失,服务也不会在下一行运行。

您可以通过在https://hub.docker.com的搜索框中键入“syslog”来找到预构建的syslog-ng映像,这将避免此问题。与您一样,在CentOS基础上安装syslog-ng也可能有效,但完全跳过systemd,只需将服务作为映像运行的主要命令运行即可

CMD ["syslog-ng", "-F"]
 类似资料:
  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您

  • 我有一个使用调用的进程。此任务被提交给executor服务。我允许进程在尝试取消它之前有x秒的运行时间。但是,当我调用并且任务在方法中等待时,线程/任务不会被取消。 我已经对代码进行了测试,如果将替换为,则会得到。但是,当任务位于内时,不会出现中断。在face中,直到Restful调用完成,该方法才返回。 我看到了这篇文章,取消、中止、中断一个spring android resttemplate

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核

  • 我为Select创建了动态DB2存储过程。我将使用这个泛型查询通过传递参数来执行多个select语句。 下面是我的查询的样子。 当我运行这个的时候

  • 以下是我所做的: 提前致谢

  • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码: