今天在docker容器中使用centos7官方镜像启动了一个容器,在安装ssh服务后,想使用systemctl启动服务,结果报下列错误:

[root@eb58e337fdc7 /]# systemctl
Failed to get D-Bus connection: Operation not permitted

百度搜了一下,网上有的文章说加一个--privileged参数即可解决,于是重新创建容器,命令如下:

docker run -d -it -p 22:22 --name nginx --privileged centos:centos7.7.1908

启动后测试,错误仍然存在,遂查了一下docker帮助中的这个参数的定义:

$ docker run --help
--privileged      Give extended privileges to this container

意思就是赋予此容器扩展的特权,使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。但这个参数的默认值是false,所以必须显示指定--privileged=true

然后继续:

$ docker run -d -it -p 22:22 --name nginx --privileged=true centos:centos7.7.1908

容器创建成功,测试systemctl,仍然报错:

Failed to get D-Bus connection: Operation not permitted

有些郁闷了,继续网上搜,发现有篇文章说创建容器时加上/usr/sbin/init即可,但这篇文章中并没有加--privileged=true参数,于是我拿掉了这个参数,使用如下命令创建容器:

$ docker run -d -it -p 22:22 --name nginx centos:centos7.7.1908 /usr/sbin/init

马上试了一下,错误依旧,没办法,于是将两种方法结合起来试试,说干说干,马上创建容器,命令如下:

docker run -d -it -p 22:22 --name nginx --privileged=true centos:centos7.7.1908 /usr/sbin/init

进入容器测试systemctl,奇迹出现了,居然可以用了:

$ docker exec -it nginx /bin/bash
[root@8d6474af502c /]# systemctl
UNIT                               LOAD   ACTIVE     SUB       DESCRIPTION
dev-md1.device                     loaded activating tentative /dev/md1
dev-zram0.device                   loaded activating tentative /dev/zram0
dev-zram1.device                   loaded activating tentative /dev/zram1
-.mount                            loaded active     mounted   /
dev-mqueue.mount                   loaded active     mounted   POSIX Message Queue File System
etc-hostname.mount                 loaded active     mounted   /etc/hostname
etc-hosts.mount                    loaded active     mounted   /etc/hosts
etc-resolv.conf.mount              loaded active     mounted   /etc/resolv.conf
sys-fs-fuse-connections.mount      loaded active     mounted   FUSE Control File System
sys-kernel-config.mount            loaded active     mounted   Configuration File System
..........

总结一下:要想使用systemctl命令,必须使用参数--privileged=true,且加上/usr/sbin/init,二者缺一不可。

发表评论