如何在容器中访问 host 中的 DBus
首先我们要知道,host 上的 DBus daemon 有两个,一个是 system daemon,一个是 user session daemon。 在大多数情况下,容器中访问的都是 user session daemon,而不是 system daemon,这两类 daemon 的访问方式也不太一样。
访问 DBus user session daemon
DBus user session daemon 又分两种情况,一种是通过 real unix socket 文件来访问的,还有一类是通过 abstract unix socket 来访问的。
其中 real unix socket 是真实存在于文件系统中的,可以直接通过 -v
挂载到容器中以供访问;而 abstract unix socket 是存在于一个所谓抽象命名空间内的,我们只能通过 --net=host
来允许容器访问到它。
判断 DBus user session daemon 的类型
我们可以通过查看 ${DBUS_SESSION_BUS_ADDRESS}
的值来区分是使用real unix socket还是abstract unix socket.
其中以 unix:path
开头则表示使用的是real unix socket,而已 unix:abstract
开头则表示使用abstract unix socket
比如我本机上的结果为:
echo ${DBUS_SESSION_BUS_ADDRESS}
unix:path=/run/user/1000/bus
说明本机使用real unix socket,且文件路径为 /run/user/1000/bus
挂载 DBus user session daemon
real unix socket
设置
DBUS_SESSION_BUS_ADDRESS
环境变量--env DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS"
挂载socket文件
--volume /run/user/1000/bus:/run/user/1000/bus
使用与host相同的用户运行镜像
--user $(id -u):$(id -g)
abstract unix socket
设置
DBUS_SESSION_BUS_ADDRESS
环境变量--env DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS"
允许容器访问host网络域
--network=host
测试挂载 DBus user session daemon 的效果
先准备一个测试镜像(假设名为 test),需要包含 notify-send 命令
FROM ubuntu:18.04 # 使用aliyun的源 RUN sed -i 's#http://archive.ubuntu.com/ubuntu#http://mirrors.aliyun.com/ubuntu#' /etc/apt/sources.list # 安装notify-send命令在libnotify-bin包中 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y libnotify-bin && rm -rf /var/lib/apt/lists/* && rm -rf /var/cache/apk/* && apt-get autoremove
启动容器
docker run --rm --env DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" --volume /run/user/$UID/bus:/run/user/$UID/bus --user $UID:$(id -g) test bash -c 'notify-send -t 10000 "hello I am $(hostname)"'
说明容器内确实可以访问 host 上的 DBus user session daemon
访问 DBus system daemon
只需要通过 --volume /run/dbus/system_bus_socket:/run/dbus/system_bus_socket
分享 DBus system daemon 即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: WSL 手工挂载 U盘
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论