In my previous post I discussed reading Govee sensor temperature in a script. And that is perfectly fine. However, this is not ideal for my server environment. What I want is a Docker container.
Since I like Alpine images, the first step was to compile GoveeBTTempLogger. After installing prerequisites, I was greeted with bunch of errors:
/root/GoveeBTTempLogger/goveebttemplogger.cpp: In function 'bool ValidateDirectory(const std::filesystem::__cxx11::path&)':
/root/GoveeBTTempLogger/goveebttemplogger.cpp:924:23: error: aggregate 'ValidateDirectory(const std::filesystem::__cxx11::path&)::stat64 StatBuffer' has incomplete type and cannot be defined
924 | struct stat64 StatBuffer;
| ^~~~~~~~~~
/root/GoveeBTTempLogger/goveebttemplogger.cpp:925:59: error: invalid use of incomplete type 'struct ValidateDirectory(const std::filesystem::__cxx11::path&)::stat64'
925 | if (0 == stat64(DirectoryName.c_str(), &StatBuffer))
| ^
...
As lovers of Alpine know, due to its use of musl, this is not an uncommon occurrence. Fix was easy enough so I created a pull request myself. With this sorted out, it was time for Dockerfile
.
Base prerequisites were obvious:
FROM alpine:latest
USER root
RUN apk add dbus bluez bluez-dev libstdc++
RUN rc-update add dbus bluetooth default
...
However, depending on services is not something Alpine does out-of-box. Openrc runlevel requires more direct access to machine. But, since I was not the first person needing it, solution already exists and it’s called softlevels
. To enable them, three lines are enough:
RUN apk add openrc
RUN mkdir -p /run/openrc/exclusive
RUN touch /run/openrc/softlevel
This and a couple of wrapper scripts was all that was needed to get it running. But, I was still one step away from making it work in my environment. I needed compose.yaml
and this is what I came up with (notice dbus
volume):
services:
govee2telegraf:
container_name: govee2telegraf
image: medo64/govee2telegraf:latest
restart: unless-stopped
privileged: true
environment:
TELEGRAF_HOST: <host>
TELEGRAF_PORT: <port>
TELEGRAF_BUCKET: <bucket>
TELEGRAF_USERNAME: <username>
TELEGRAF_PASSWORD: <password>
volumes:
- /var/run/dbus/:/var/run/dbus/:z
Image is available on DockerHub and everything else is on GitHub.