Bluetooth within docker-compose

Hi @ all,

I working on a composed setup for running my rpi3 as a flic-host.
Flic is a little bluetooth-button which can connect to your smartphone or other linux based bluetooth devices.

The idea is to use the flic-library (here), which is basically a bluetooth connector to find an manage your buttons, and a mosquito instance to publish the button events via MQTT.

My docker-compose should create two containers one with the flic-host and one with the mosquito instance.
But i cannot get bluetooth working within the composed setup.
Within a single container configuration my flic-container just works fine with the following Dockerfile:

FROM resin/raspberrypi3-debian:jessie
   
# Configure
EXPOSE 5551
WORKDIR /usr/src/app

# Copy files
COPY bootstrap /bootstrap
COPY data /data
COPY app /usr/src/app


# Install requirements
RUN apt-get update -y && apt-get dist-upgrade -y && apt-get upgrade -y && \
    apt-get install -y $(cat /bootstrap/deps/apt.list | tr '\n' ' ') && \
    pip3 install -r /bootstrap/deps/pip.list && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Copy flicd executable
RUN git clone https://github.com/50ButtonsEach/fliclib-linux-hci /bootstrap/flic/src && \
    cp /bootstrap/flic/src/bin/armv6l/flicd /usr/bin/flicd && \
    chmod +x /usr/bin/flicd

# Tidy up
RUN rm -rf /bootstrap

# Start
ENTRYPOINT ["/usr/bin/flicd", "-f", "/data/flic.db", "-s", "0.0.0.0", "-p", "5551"]

Where ‘/bootstrap/deps/apt.list’ contains:

dbus
systemd-sysv
bluez
bluez-firmware
git
python3
python3-pip

and ‘/bootstrap/deps/pip.list’ contains:

asyncio
paho-mqtt

The resulting log is:

Available HCI devices found:
hci0

Trying hci0
Successfully bound HCI socket
Flic server is now up and running!
Warning: Bluetooth controller does not support pending connection and scanning at the same time. Will emulate this as good as possible.
Initialization of Bluetooth controller done!

Which is fine.

when I embed this into the following ‘docker-compose.yml’:

version: '2'
services:
  flic:
    build: ./flic
    privileged: true
    restart: always
    ports:
      - "5551:5551"

I get this log:

opening bluetooth socket failed: Address family not supported by protocol
Make sure you have a recent Linux kernel (3.13 or newer) with compiled support for Bluetooth

The RaspberryPi 3 runs resinOS 2.12.7+rev1
docker: version 18.03.1-ce, build 9ee9f40
docker-compose: version 1.21.1, build 5a3f1a3

Is there a way to get this working ?

Hi,
Bluetooth should work out of the box. I suspect your are missing some label in your compose file. If an application does not have a docker-compose file, we generate a default one. If you look up the Releases of your application in the resin dashboard, you can see the generated docker-compose file.
If you use the docker-compose file from a release where we generated the file, it should work, and you can reduce the compose file from there. I tried to reproduce this, but was not able to, with a quick dummy application.

Best regards,
Andreas

1 Like

Hi,
I just got the hint, that the container has to use network_mode: host in the docker-compose file to use BT.
Best regards,
Andreas

3 Likes

That was all ? ^^

Wow, works great.

Thank you really much for your help.

I have a similar issue except when I add network_mode: host to make in the docker-compose file to make bluetooth the container fails to start.

Well at least I cant ssh to it from the console, it produces no logs.

version: ‘2’
services:
schub:
build: ./schub
privileged: true
network_mode: host
~

Dockerfile.template==================

Use apt-get to install dependencies

RUN apt-get update && apt-get install -yq --no-install-recommends
bluetooth dbus bluez libbluetooth-dev libudev-
python-bluetooth
python3 python3-pip python3-dateutil
screen
dhcpcd5
modemmanager
dnsmasq &&
apt-get clean && rm -rf /var/lib/apt/lists/*

Upgrade pip

RUN pip all --upgrade pip

Hi,
One follow up of this.
Although the answer is correct, in another application I got access to the BT by network_mode:host, it also breaks communications with other containers. As I understanding, since the network changed.

Is there an alternative approach to have access to the BT device and maintain the connection to other containers?

Thanks