首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头CentOS系统不允许

码头CentOS系统不允许
EN

Stack Overflow用户
提问于 2018-10-10 09:45:59
回答 3查看 10K关注 0票数 4

我试图使用systemctl命令构建一个CentOS映像。但是每次,当我构建它的时候,。我得到了这个错误:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

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

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-10 10:28:49

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

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

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

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

代码语言:javascript
复制
CMD ["syslog-ng", "-F"]
票数 3
EN

Stack Overflow用户

发布于 2018-10-10 16:23:01

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

如果您真的想使用经典的sbin/init,那么您应该先安装initscripts包。如果您希望与实际系统的安装指令保持更好的兼容性,那么您可以使用一个没有systemd守护进程工作的工具来替换systemctl,例如船坞-系统-替换,它也作为CMD作为init守护进程运行所有已启用的服务的正确顺序。

票数 1
EN

Stack Overflow用户

发布于 2019-04-17 04:10:13

在码头运行真正的init系统是很有用的。它将所有的工作都从文档化中删除,日志记录工作正常,CMD始终可以是/sbin/init。我和您有同样的问题,systemctl没有工作,服务在跟踪centos的文档时似乎根本没有启动。

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

我想知道需要哪一种?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52737283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档