【问题标题】:Docker CentOS systemctl not permittedDocker CentOS systemctl 不允许
【发布时间】:2019-03-15 04:35:51
【问题描述】:

我尝试使用 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

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

谢谢,

【问题讨论】:

    标签: docker dockerfile centos7 systemd


    【解决方案1】:

    在 docker 中运行真正的初始化系统很有用。它将所有工作都从 dockerization 中解脱出来,日志记录工作正常,并且 CMD 始终可以只是 /sbin/init。我遇到了和你一样的问题,systemctl 没用,而且在关注 centos 的文档时,服务似乎根本没有启动。

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

    我想知道哪些是必需的?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我有几个问题。如何用 docker-systemctl-replacement 替换 systemd? (有没有具体的步骤需要遵循)
      • 在容器中安装python并覆盖/usr/bin/systemctl。将 CMD 替换为 /usr/bin/systemctl 以使其运行容器中的应用程序 - 由“systemctl enable xxx.service”启用。
      【解决方案3】:

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

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

      在 Dockerfile 上下文中,还有一个问题,即每个 RUN 行都从一个干净的状态开始,根本没有任何进程在运行。所以你的systemctl start ... 命令不起作用,因为systemd init 没有运行;即使它确实如此,当该 RUN 命令完成时,该进程也会消失并且服务不会在下一行运行。

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

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

      【讨论】:

      • 谢谢,这对我的用例有用。但是我个人知道的一个问题:为什么在官方 CentOS 映像中,我们可以找到这个:github.com/docker-library/docs/tree/master/… 来使用systemctl?按照你上面说的。
      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多