docker - 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
有人知道我做错了什么吗?
谢谢,
解决方案
您应该假设 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"]
推荐阅读
- java - 如何在java中将空字符串反序列化为空值?
- c# - 在 Unity3d 中使用 TangibleEngine 时,如何避免 Tangibles 在多点触控屏幕中使用的接触点?
- angular - 在 ReactiveForm 中过滤复选框列表会导致呈现错误
- node.js - NodeJS mongoose 查询和承诺
- python - 根据列表中的值生成格式字符串
- c - 5.2 循环二进制如何计算二进制值
- mysql - 我有 3 个表,它们之间有多对多的关系,现在如何在 laravel 中使用 mysql 获取数据
- c# - 从 GUI 执行时进程过早结束,通过控制台测试应用程序执行时不会
- python-3.x - 使用 Numpy 改进 While 循环
- excel - 从另一个范围复制行时复制一个范围中的相同行