Docker

設置 docker 容器以通過 d-bus 與主機通信

  • March 22, 2022

我正在創建兩個應用程序,主控和從屬,它們通過 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:

來自 i386/ubuntu:16.04

執行 apt-get 更新
執行 apt-get upgrade -y
執行 apt-get install -y dbus

複製 dbus.conf /etc/dbus-1/session.d/

入口點 ["dbus-run-session", "slaveApp"]

還有我的 dbus.conf:

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
   "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">

<busconfig>
   <listen>tcp:host=localhost,bind=*,port=6667,family=ipv4</listen>
   <listen>unix:tmpdir=/tmp</listen>
   <auth>ANONYMOUS</auth>
   <allow_anonymous/>
</busconfig>

並在主機上設置地址變數:

導出 DBUS_SESSION_BUS_ADDRESS=tcp:host=${containerIp},port=6667,family=ipv4

在我的主應用程序中,我啟動了一個連接(我使用了 Qt):

QDBusConnection::connectToBus("tcp:host=${containerIp},port=6667", "qt_default_session_bus");

主應用程序現在可以向從屬應用程序發送消息。不過,我還沒有嘗試將消息從奴隸發送到主人。

答案來自這篇文章: https ://stackoverflow.com/a/45487266/6509266

引用自:https://unix.stackexchange.com/questions/546726