【问题标题】:Accessing Bluetooth dongle from inside Docker?从 Docker 内部访问蓝牙加密狗?
【发布时间】:2015-03-05 01:26:02
【问题描述】:

是否可以在 docker 容器内使用蓝牙(在我的情况下为 BLE)加密狗?

在我的主机上:

$ hcitool dev
    Devices:
       hci0   5C:F3:70:64:F0:11

在 Docker 内部它什么也找不到。我正在运行 Docker:

sudo docker run --privileged -i -t ubuntu /bin/bash

我对 Linux 中的蓝牙子系统了解不够,无法理解主机和 docker 之间的区别。

hci0 设备确实出现在两个系统中:

$ ls -l /sys/class/bluetooth
lrwxrwxrwx  1 root root 0 Mar  5 01:23 hci0 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.3/2-2.3:1.0/bluetooth/hci0

有人尝试在 Docker 中使用蓝牙吗?

【问题讨论】:

标签: linux docker bluetooth


【解决方案1】:

如果您想从 docker 运行 bluez(而不仅仅是公开 hci 适配器),您需要:

  • sudo docker run --privileged -i -t your_image_name /bin/bash 启动你的d​​ocker
  • 确保bluez 没有在您的主机上运行。在我的情况下,我添加了 kill bluez (killall -9 bluetoothd) (并没有正确停止它,因为它会关闭我的蓝牙适配器并且不会将其暴露到 docker 中)
  • 在您的 docker 入口点中,您需要启动 dbus (/etc/init.d/dbus start) 和 bluez (/usr/libexec/bluetooth/bluetoothd --debug &)

【讨论】:

  • 从码头集装箱
  • 反之亦然吗?在主机上运行 bluez 并将 dbus 套接字映射到容器? (这几乎可以工作,不知道缺少什么)
【解决方案2】:

试试这个:

sudo docker run --net=host --privileged -i -t ubuntu /bin/bash

【讨论】:

  • 这里为什么需要--net=host
  • 当时我正在通过pand 修改TCP/IP over Bluetooth,所以我可以ssh
【解决方案3】:

我可以确认 OlivierM 所写的内容对我有用。花了一些时间在 Raspberry Pi 3B+ 及其内置蓝牙上。

Dockerfile:

FROM python:3.7

RUN apt-get update

RUN apt-get install -y bluez bluetooth

ENTRYPOINT sh docker_entrypoint.sh

和入口点:

#!/bin/bash

service dbus start
bluetoothd &

/bin/bash

在启动容器之前,主机上需要sudo killall -9 bluetoothd

docker run --rm --net=host --privileged -it myimage:mytag

【讨论】:

    【解决方案4】:

    在 Docker 社区的帮助下,我在 docker 容器中成功启动了 DBus/蓝牙服务,并通过添加 --cap-add=SYS_ADMIN、--cap-add=NET_ADMIN 和 --net=host flags/permission 扫描蓝牙设备

    docker run --cap-add=SYS_ADMIN --cap-add=NET_ADMIN --net=host -it debian:jessie

    现在只想通过“不共享主机网络命名空间”来启动蓝牙服务(自定义 --net=host 到专用网络)

    如果有人有任何线索,那会很有帮助。谢谢。

    【讨论】:

      【解决方案5】:

      我发现有两种方法可以做到这一点:

      1. 主机和容器之间共享蓝牙访问。 此模式是通过与容器共享/var/run/dbus 作为卷挂载来完成的。这意味着容器也将使用来自主机的 dbus。容器不应启动自己的 dbus 或蓝牙服务 - 这应该在主机中完成。它使docker_entrypoint.sh 脚本变得多余。 https://www.raspberrypi-bluetooth.com/bluetooth-application-in-python.html

        提供了展示这种方法的教程

        方法:

        • 在容器中安装你需要的蓝牙包
        • 确保蓝牙服务正在您的主机操作系统上运行
        • 使用卷挂载运行您的容器,也许使用--privileged
          docker run -v /var/run/dbus/:/var/run/dbus/:z --privileged {containerImage}
          
      2. 容器对蓝牙的独家访问。这需要停止主机中的蓝牙服务(否则容器不能“认领”它)。 这个方法后面可以跟上面的答案

      【讨论】:

        猜你喜欢
        • 2012-06-20
        • 2016-10-16
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 2019-03-18
        • 2016-12-04
        相关资源
        最近更新 更多