在 Docker 容器中使用 nmcli

7

我现在正在寻找如何在 Docker 容器中运行 nmcli。

nmcli 在我的主机上很好用,但是如果我启动一个特权容器,它就不能正常工作。

要启动我的容器:

sudo docker run --privileged --net host -it image_with_network-manager /bin/bash

然后运行 nmcli 命令

nmcli dev wifi  => Error: Could not create NMClient object: Could not connect: No such file or directory

如果我的容器内的ifconfig正常,那么主机将会显示eth0和wlan0。


你可以用 strace nmcli dev wifi 命令来检查哪个文件无法打开,并告诉我们吗? - jjmontes
谢谢你的帮助,这是 strace 的链接:https://pastebin.com/3PYdV7SW,有很多 ENOENT(没有此文件或目录),但我不知道它是否相关。 - Maxime Krier
ENOENT是常见的,因为在许多不同的路径中尝试打开文件时找不到该文件(ENOENT),而这并不是错误。我通常从末尾开始阅读这些类型的strace转储。我们可以看到在错误之前有一个futex调用,但恐怕这个strace对我来说意义不大(也许对其他更了解nmcli内部的人有意义)。也许nmcli正在尝试与其他服务通信并失败了:/。另请参阅:https://success.docker.com/article/should-you-use-networkmanager - jjmontes
3个回答

5
我这样运行容器:
在Ubuntu18.04上使用以下命令:docker run -d -it --privileged=true --net host --volume /var/run/dbus:/var/run/dbus [其他参数],并且它能够正常工作。
注意: --volume /var/run/dbus:/var/run/dbus 而不是 --volume /var/run/dbus。以上的卷共享标志用于共享外部系统的总线。如果您需要容器拥有自己的总线,则需要进行不同的配置。

3

关于NetworkManager的问题在于它运行在DBus上。我也做了同样的事情(使用strace并查看需要什么)。

尝试将/var/run/dbus挂载为卷。

sudo docker run --privileged --net host -it --volume /var/run/dbus image_with_network-manager /bin/bash


2

尝试在Docker中创建自己的DBus。

docker run -it --net=host image_name
        
dbus-uuidgen > /var/lib/dbus/machine-id
mkdir -p /var/run/dbus
dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接