我正在创建两个应用程序,主控和从属,它们通过 d-bus 进行通信。在同一主机上运行时,我的应用程序按预期工作。
现在我想将从属应用程序移动到 docker 容器,并且在主机和容器之间共享 d-bus 会话时遇到问题。这是我的 Dockerfile:
来自 i386/ubuntu:16.04 音量/运行/用户/1000/ ENV DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus 运行 apt-get 更新 运行 apt-get upgrade -y 运行 apt-get install -y dbus #RUN apt-get install -y libnotify-bin #RUN apt-get install -y dbus-x11 运行 adduser -u 1000 myuser #COPY dbus.conf /etc/dbus-1/session.d/ 用户 1000:1000 入口点 ["dbus-daemon", "--session", "--print-address"]
/run/user/1000/bus 是我的 DBUS_SESSION_BUS_ADDRESS 变量的值。
我用
docker create --mount type=bind,source=/run/user/1000/bus,target=/run/user/1000/bus mycontainer
/run/user/1000/bus 在容器内是可见的,但是当容器启动时它会打印地址
unix:abstract=/tmp/dbus-iXrYzptYOX,guid=78a790f0f6a4387a39ac3d505da478a3我的应用程序无法通信。
如果我将我的 dbus.conf 添加到容器中的 /etc/dbus-1/session.d/ 并覆盖
<listen>unix:path=/run/user/1000/bus</listen>
我收到消息“无法启动消息总线:无法绑定套接字“/run/user/1000/bus”:地址已在使用中”
我不确定我是否应该在 docker 中启动 dbus-daemon。
我怎样才能使这项工作?
我找到了解决方案。这是我的 Dockerfile:
还有我的 dbus.conf:
并在主机上设置地址变量:
在我的主应用程序中,我启动了一个连接(我使用了 Qt):
主应用程序现在可以向从属应用程序发送消息。不过,我还没有尝试将消息从奴隶发送到主人。
答案来自这篇文章: https ://stackoverflow.com/a/45487266/6509266
对我来说,我需要将以下内容合并到我想要访问的 docker-compose.yml 服务中:
(我不知道是否需要 X11 位 - dbus 会话总线地址和 security_opt 是重要的位)
我正在为 libnotify 执行此操作 - 所以我需要确保安装了 libnotify-bin 包(或者任何给你
notify-send
系统上的命令的东西)然后做一个
docker-compose up
并检查是否notify-send hello
有效!我能够通过以下(在 Ubuntu 上)获得 Spotify的容器化安装来获取主机 DBus
因此,这里的关键似乎是确保您已将主机绑定安装
DBUS_SESSION_BUS_ADDRESS
到容器中并在那里导出具有相同值的相同变量。我在容器上也安装了 DBus,但鉴于我没有启动映像而只是运行 Spotify,我认为它不是必需的。