从Docker内部访问蓝牙适配器?

Bra*_*rad 7 linux bluetooth docker

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

在我的主机上:

$ hcitool dev
    Devices:
       hci0   5C:F3:70:64:F0:11
Run Code Online (Sandbox Code Playgroud)

在Docker里面它找不到任何东西.我正在运行Docker:

sudo docker run --privileged -i -t ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

我对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
Run Code Online (Sandbox Code Playgroud)

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

小智 10

我可以确认 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
Run Code Online (Sandbox Code Playgroud)

和入口点:

#!/bin/bash

service dbus start
bluetoothd &

/bin/bash
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm --net=host --privileged -it myimage:mytag
Run Code Online (Sandbox Code Playgroud)


typ*_*gic 8

尝试这个:

sudo docker run --net=host --privileged -i -t ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 为什么这里需要 `--net=host` ? (6认同)

han*_*ker 8

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

  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}
      
      Run Code Online (Sandbox Code Playgroud)
  2. 通过容器独占访问蓝牙。这需要停止主机中的蓝牙服务(否则容器无法“声明”它)。这个方法可以跟上面的答案一样


Oli*_*erM 6

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

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