从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

这无济于事。我还尝试将docker命令-u 1000:1000与localhost用户的uid和gid添加在一起。什么都没有。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)