Docker CentOS systemctl 不允许
Docker CentOS systemctl not permitted
我正在尝试使用 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 home page 上的图形:它想做一堆内核级设置,管理文件系统,并启动几个服务,所有这些都已经在主机上完成,并且在 [=25] 中是不必要的=] 容器。在 Docker 中 运行 systemd 的 "easy" 方法包括授予它重新配置主机的权限;您提供的 link 有一种 "hard" 方法,涉及删除其大部分控制文件。
在 Docker 文件上下文中还有一个问题,即每个 运行 行都从一个干净的平板开始,根本没有进程 运行ning。所以你的 systemctl start ...
命令不起作用,因为 systemd init 不是 运行ning;即使它这样做了,当 运行 命令完成时,进程也会消失,服务不会在下一行 运行ning。
您也许可以找到 a prebuilt syslog-ng image by typing "syslog" into the search box on https://hub.docker.com,它可以避免这个问题。它也可能像你一样在 CentOS 基础上安装 syslog-ng,但完全跳过 systemd,只是 运行 服务作为主要命令图像 运行s
CMD ["syslog-ng", "-F"]
CentOS 7 及更高版本上的 systemctl
工具本身不会做任何事情,它只会与 PID 1 上的 systemd 守护进程对话。它为此使用 dbus 连接 - 这就是错误的原因你看到的。
如果你真的想使用经典的 sbin/init 那么你应该先安装 initscripts
包。如果你想与真实系统的安装说明保持更多的兼容性,那么你也可以用一个没有 systemd 守护进程的工具替换 systemctl
,例如docker-systemctl-replacement,它也作为 CMD 用作初始化守护进程,以正确的顺序运行所有启用的服务。
它对 运行 docker 中的真正初始化系统很有用。它消除了 docker 化的所有工作,日志记录正常工作,CMD 始终只是 /sbin/init。我和你有同样的问题,按照centos的文档,systemctl没有工作,服务似乎根本没有启动。
尝试忽略有关在启动容器之前删除所有系统单元的建议,如 https://github.com/dholth/vagrant-docker
我想知道哪些是必需的?
我正在尝试使用 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 home page 上的图形:它想做一堆内核级设置,管理文件系统,并启动几个服务,所有这些都已经在主机上完成,并且在 [=25] 中是不必要的=] 容器。在 Docker 中 运行 systemd 的 "easy" 方法包括授予它重新配置主机的权限;您提供的 link 有一种 "hard" 方法,涉及删除其大部分控制文件。
在 Docker 文件上下文中还有一个问题,即每个 运行 行都从一个干净的平板开始,根本没有进程 运行ning。所以你的 systemctl start ...
命令不起作用,因为 systemd init 不是 运行ning;即使它这样做了,当 运行 命令完成时,进程也会消失,服务不会在下一行 运行ning。
您也许可以找到 a prebuilt syslog-ng image by typing "syslog" into the search box on https://hub.docker.com,它可以避免这个问题。它也可能像你一样在 CentOS 基础上安装 syslog-ng,但完全跳过 systemd,只是 运行 服务作为主要命令图像 运行s
CMD ["syslog-ng", "-F"]
CentOS 7 及更高版本上的 systemctl
工具本身不会做任何事情,它只会与 PID 1 上的 systemd 守护进程对话。它为此使用 dbus 连接 - 这就是错误的原因你看到的。
如果你真的想使用经典的 sbin/init 那么你应该先安装 initscripts
包。如果你想与真实系统的安装说明保持更多的兼容性,那么你也可以用一个没有 systemd 守护进程的工具替换 systemctl
,例如docker-systemctl-replacement,它也作为 CMD 用作初始化守护进程,以正确的顺序运行所有启用的服务。
它对 运行 docker 中的真正初始化系统很有用。它消除了 docker 化的所有工作,日志记录正常工作,CMD 始终只是 /sbin/init。我和你有同样的问题,按照centos的文档,systemctl没有工作,服务似乎根本没有启动。
尝试忽略有关在启动容器之前删除所有系统单元的建议,如 https://github.com/dholth/vagrant-docker
我想知道哪些是必需的?