Multi-architecture Docker images for rtl_433 - a generic data receiver for ISM band devices using RTL-SDR and SoapySDR.
# Find your USB device
lsusb | grep RTL
# Run rtl_433 (replace 001/003 with your bus/device)
docker run --device /dev/bus/usb/001/003 hertzg/rtl_433Tip: Device paths can change on reboot. For stable, persistent identification, use serial number selection instead.
| Variant | Base | Size | SDR Support |
|---|---|---|---|
alpine (default) |
Alpine Linux | ~3 MB | RTL-SDR |
debian |
Debian | ~50 MB | RTL-SDR + SoapySDR |
Images are available from multiple registries:
hertzg/rtl_433:<version>-<base>-<base_version>
hertzg/rtl433:<version>-<base>-<base_version>
ghcr.io/hertzg/rtl_433_docker:<version>-<base>-<base_version>
Only the last 3 releases plus master are built:
| Tag | Description |
|---|---|
latest |
Latest stable release (Alpine) |
master |
Latest development build |
25.12, 25.02, 24.10 |
Specific releases |
docker run hertzg/rtl_433:latest
docker run hertzg/rtl_433:25.12
docker run hertzg/rtl_433:25.12-alpine
docker run hertzg/rtl_433:25.12-debian-trixie
docker run hertzg/rtl_433:master$ lsusb
Bus 001 Device 003: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-TThe device path is /dev/bus/usb/<bus>/<device> β /dev/bus/usb/001/003
Note: Device paths may change on reboot or replug. See #14 for details. For persistent identification, use serial numbers.
docker run --device /dev/bus/usb/001/003 hertzg/rtl_433Arguments are passed directly to rtl_433:
docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 -V # version
docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 -F json # JSON output
docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 -R 40 -R 41 # specific decodersDevice paths like /dev/bus/usb/001/003 can change on reboot or replug. For reliable, persistent device identification, use serial number selection:
# Pass entire USB bus and select by serial
docker run --device /dev/bus/usb hertzg/rtl_433 -d :00000001This approach:
- Works reliably across reboots
- Handles device re-enumeration automatically
- Is required for multiple RTL-SDR dongles
Finding your serial number:
lsusb -v -d 0bda:2838 2>/dev/null | grep iSerialSetting a unique serial number:
rtl_eeprom -s 00000001 # Connect one device at a timeSee #14, #45, #82 for background.
Mount your config file into the container (#108, #78):
docker run --device /dev/bus/usb/001/003 \
-v /path/to/rtl_433.conf:/etc/rtl_433/rtl_433.conf:ro \
hertzg/rtl_433Or specify the path explicitly:
docker run --device /dev/bus/usb/001/003 \
-v /path/to/my.conf:/config/my.conf:ro \
hertzg/rtl_433 -c /config/my.confSet the TZ environment variable:
docker run --device /dev/bus/usb/001/003 \
-e TZ=America/New_York \
hertzg/rtl_433 -M time:tzFor rootless Docker, set up udev rules on the host (#118):
# Download udev rules
sudo curl -o /etc/udev/rules.d/rtl-sdr.rules \
https://raw.githubusercontent.com/osmocom/rtl-sdr/master/rtl-sdr.rules
sudo udevadm control --reload-rules
# Find plugdev group ID
grep plugdev /etc/group
# Run with group access (replace 46 with your plugdev GID)
docker run --device /dev/bus/usb/001/003 \
--user "$(id -u):$(id -g)" \
--group-add 46 \
hertzg/rtl_433docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 \
-F mqtt://192.168.1.100:1883docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 \
-F "mqtt://192.168.1.100:1883,user=myuser,pass=mypass"docker run --device /dev/bus/usb/001/003 hertzg/rtl_433 \
-M time:unix:usec:utc \
-F mqtt://192.168.1.100:1883 \
-F "influx://192.168.1.100:8086/write?db=rtl433"services:
rtl433:
image: hertzg/rtl_433:latest
restart: unless-stopped
devices:
- /dev/bus/usb # Pass entire bus for stable device discovery
environment:
- TZ=Europe/London
command:
- -d :00000001 # Select device by serial (stable across reboots)
- -M time:unix:usec:utc
- -M protocol
- -F mqtt://mosquitto:1883,retain=1
- -F influx://influxdb:8086/write?db=rtl433
mosquitto:
image: eclipse-mosquitto:2
influxdb:
image: influxdb:1.8Note: Using
-d :SERIALwith/dev/bus/usbis more reliable than specifying a device path like/dev/bus/usb/001/003, which can change on reboot.
With specific device path (less stable):
services:
rtl433:
image: hertzg/rtl_433:latest
devices:
- /dev/bus/usb/001/003 # May change on reboot
command:
- -F mqtt://mosquitto:1883| Architecture | Alpine | Debian | Devices |
|---|---|---|---|
linux/amd64 |
β | β | x86_64 PCs, servers |
linux/arm64 |
β | β | Raspberry Pi 4/5, Apple Silicon |
linux/arm/v7 |
β | β | Raspberry Pi 2/3 (32-bit) |
linux/arm/v6 |
β | β | Raspberry Pi Zero/1 |
Another process is using the device (#33). Unload the kernel driver:
sudo rmmod dvb_usb_rtl28xxu rtl2832To prevent auto-loading, blacklist the module:
echo "blacklist dvb_usb_rtl28xxu" | sudo tee /etc/modprobe.d/blacklist-rtl.confThe RTL-SDR Blog V4 requires newer drivers not included in the standard image. See #106 for building a custom image.
# Verify device exists on host
ls -la /dev/bus/usb/001/003
# Test with privileged mode (debugging only)
docker run --privileged -v /dev/bus/usb:/dev/bus/usb hertzg/rtl_433Use serial number selection instead of device path (#14):
docker run --device /dev/bus/usb hertzg/rtl_433 -d :YOUR_SERIAL