首页 > 解决方案 > Docker CentOS systemctl 不允许

问题描述

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

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

谢谢,

标签: dockerdockerfilecentos7systemd

解决方案


您应该假设 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"]

推荐阅读