如何在容器中访问 host 中的 DBus

发布于 2023-03-18 15:21:12 字数 2679 浏览 87 评论 0

首先我们要知道,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

  1. 设置 DBUS_SESSION_BUS_ADDRESS 环境变量

    --env DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS"
    
  2. 挂载socket文件

    --volume /run/user/1000/bus:/run/user/1000/bus
    
  3. 使用与host相同的用户运行镜像

    --user $(id -u):$(id -g)
    

abstract unix socket

  1. 设置 DBUS_SESSION_BUS_ADDRESS 环境变量

    --env DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS"
    
  2. 允许容器访问host网络域

    --network=host
    

测试挂载 DBus user session daemon 的效果

  1. 先准备一个测试镜像(假设名为 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
    
  2. 启动容器

    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

我还不会笑

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文