首页 > 解决方案 > 从 docker 到主机和反向的 DBus 通信

问题描述

我正在尝试从 docker java 应用程序控制蓝牙交互。我已经使用了com.github.hypfvieh.bluetooth像魅力一样工作的图书馆。但是一旦我在 docker 中运行这个应用程序,我就无法与系统 DBus 交互。我达到的最佳状态是使用此命令行运行容器

podman run --rm -it --privileged -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket --name NAME  IMAGE

看来我可以联系 DBus,但authentication被拒绝了。

org.freedesktop.dbus.exceptions.DBusException: Failed to connect to bus: Failed to auth
        at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:166) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.impl.DBusConnection.<init>(DBusConnection.java:334) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) ~[dbus-java-3.2.1.jar:3.2.1]
        at com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) ~[bluez-dbus-0.1.2.jar:0.1.2]
        at package.dbus.BluetoothDBus.<init>(BluetoothDBus.java:24) ~[run.jar:1.0-SNAPSHOT]
        at package.dbus.BluetoothDBus.createInstance(BluetoothDBus.java:28) ~[run.jar:1.0-SNAPSHOT]
        at package.dbus.DBusInteractionWebSocket.onMessage(DBusInteractionWebSocket.java:46) [run.jar:1.0-SNAPSHOT]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?]
        at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:402) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:502) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:301) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148) [tomcat-embed-websocket-9.0.38.jar:9.0.38]
        at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) [?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) [?:?]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.38.jar:9.0.38]
        at java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: java.io.IOException: Failed to auth
        at org.freedesktop.dbus.connections.transports.AbstractTransport.authenticate(AbstractTransport.java:114) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.transports.UnixSocketTransport.connect(UnixSocketTransport.java:68) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.transports.TransportFactory.createTransport(TransportFactory.java:44) ~[dbus-java-3.2.1.jar:3.2.1]
        at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:161) ~[dbus-java-3.2.1.jar:3.2.1]
        ... 32 more

Dockerfile看起来像这样:

FROM IMAGE:latest

COPY target/dependency-jars/ /app/dependency-jars/
COPY target/run.jar /app

WORKDIR /app

CMD [ "/bin/sh", "run.sh" ]

我试图像这样在docker文件中添加一个用户

RUN groupadd -g 1000 yves
RUN useradd -u 1000 -g 1000 yves -s /sbin/nologin -d /
USER yves

这没有帮助。我还尝试-u 1000:1000使用 localhost 用户的 uid 和 gid 添加 docker 命令。没有任何效果。

所以我不明白为什么身份验证失败,为了根据需要设置容器,它背后的规则是什么?

标签: javadockerbluetoothdbus

解决方案


推荐阅读