将 dbus 服务桥接到另一条总线

将 dbus 服务桥接到另一条总线

情况是这样的:

  • 我在主机系统上运行 NetworkManager。
  • 我有 systemd 和 dbus 在特权 Docker 容器中运行。
  • 我希望容器中的 nmcli 能够访问主机系统上的 NetworkManager。
  • 但是:我还需要能够访问容器内的 dbus 服务。
  • 容器中访问 NetworkManager 的客户端还会访问容器内的其他 Dbus 服务(例如登录),因此将整个总线转发到容器是不够的。

目标是将 NetworkManager 的请求路由到父 dbus,并将其他任何内容的请求发送到容器 dbus。

我已经看过使用 xdg-dbus-proxy 来实现这个但不可能使用它

答案1

直接将主机的DBUS套接字挂载到容器中怎么样?

sudo docker run -v /run/user/1000/bus:/host-dbus.sock --rm -it your_container

这样,容器内的所有 DBUS 流量将保持不变,并且要使用nmcli,您只需DBUS_SYSTEM_BUS_ADDRESS通过添加前缀来覆盖环境变量,如下所示:

DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host-dbus.sock nmcli [something]

您还可以/usr/local/bin使用以下内容创建一个包装器,而不是每次都为其添加前缀:

#!/bin/sh
export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host-dbus.sock
exec /usr/bin/nmcli "$@"

如果你的 PATH 设置正确,它应该/usr/local/bin/usr/bin.每次从命令行调用时nmcli,它都会使用此包装器而不是真实程序,设置 DBUS 环境变量,并将所有参数传递给原始程序。别忘了chmod +x /usr/local/bin/nmcli

请注意,让容器能够管理主机网络确实不安全。您不应该将该容器用于任何关键的事情(例如将服务公开到互联网)。只要它出于您自己的目的而保留在本地,我想就可以了。

相关内容