我正在尝试在使用Docker运行的CentOS镜像上列出服务
systemctl list-units
但我得到这个错误消息:
Failed to get D-Bus connection: Operation not permitted
有什么build议可能是什么问题?
我的猜测是你正在运行一个non-privileged容器。 systemd需要CAP_SYS_ADMINfunction,但是Docker会在非特权容器中删除该function,以便增加更多的安全性。
systemd还需要RO访问容器内的cgroup文件系统。 您可以使用–v /sys/fs/cgroup:/sys/fs/cgroup:ro添加它
所以,下面介绍如何在Docker容器中运行带有systemd的CentOS:
FROM centos MAINTAINER “Yourname" <[email protected]> ENV container docker RUN yum -y update; yum clean all RUN yum -y install systemd; yum clean all; \ (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; VOLUME [ “/sys/fs/cgroup” ] CMD [“/usr/sbin/init”]
docker build --rm -t centos7-systemd - < mydockerfile 使用docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init运行容器docker run --privileged -ti -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup centos7-systemd /usr/sbin/init
你应该在你的容器中有systemd
我已经设法在CentOS:7 Docker容器中解决这个问题。 我主要关注CentOS Docker映像项目指南 。
FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; # Install anything. The service you want to start must be a SystemD service. CMD ["/usr/sbin/init"]
现在,构build镜像,并使用docker run命令至less运行以下参数: -v /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro
那么要点就是/usr/sbin/init必须是Docker容器中的第一个进程。
因此,如果要在运行/usr/sbin/init之前使用执行某些命令的自定义脚本,请使用exec /usr/sbin/init (在bash脚本中)在脚本末尾启动它。
这里是一个例子:
ADD cmd.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/cmd.sh CMD ["/usr/local/bin/cmd.sh"]
这里是cmd.sh的内容:
#!/bin/bash # Do some stuffs exec /usr/sbin/init # To correctly start D-Bus thanks to https://forums.docker.com/t/any-simple-and-safe-way-to-start-services-on-centos7-systemd/5695/8
你可以让System is booting up. See pam_nologin(8) 如果使用PAM系统, System is booting up. See pam_nologin(8) ,在这种情况下,请删除Dockerfile /usr/lib/tmpfiles.d/systemd-nologin.conf ,因为它会创build生成此特定错误的文件/var/run/nologin 。