Running Oden Streamer in Docker

Prerequisites

To install the NVIDIA Container Toolkit on Ubuntu:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Dockerfile

The base image depends on your platform.

Desktop Ubuntu

Use an ubuntu base image matching the Oden Streamer .deb package version.

Dockerfile (Desktop)
FROM ubuntu:24.04

ARG ODEN_INSTALLER_PATH=./oden-streamer.deb

ENV DEBIAN_FRONTEND=noninteractive

COPY "$ODEN_INSTALLER_PATH" /oden-streamer.deb
RUN apt-get update -qq && \
    apt-get install -qq -y --no-install-recommends /oden-streamer.deb && \
    rm -rf /var/lib/apt/lists/* /oden-streamer.deb

USER root
CMD [ "oden-streamer", "--headless", "--configurator", "/root/project/streamer.vproj" ]
The base image Ubuntu version must match the .deb package. For example, a _24.04.deb package requires ubuntu:24.04. NVIDIA driver libraries are injected at runtime by the container toolkit, so a plain Ubuntu base image is sufficient.

Jetson

Use an L4T base image matching your host JetPack version. Check with cat /etc/nv_tegra_release.

Dockerfile (Jetson)
FROM nvcr.io/nvidia/l4t-base:36.4.0

ARG ODEN_INSTALLER_PATH=./oden-streamer.deb

ENV DEBIAN_FRONTEND=noninteractive

COPY "$ODEN_INSTALLER_PATH" /oden-streamer.deb
RUN apt-get update -qq && \
    apt-get install -qq -y --no-install-recommends /oden-streamer.deb && \
    rm -rf /var/lib/apt/lists/* /oden-streamer.deb

USER root
CMD [ "oden-streamer", "--headless", "--configurator", "/root/project/streamer.vproj" ]
The L4T base image version must match your host JetPack version. For example, JetPack 5.1 uses nvcr.io/nvidia/l4t-base:35.3.1 and JetPack 6.1 uses nvcr.io/nvidia/l4t-base:36.4.0.

Building

Place the Oden Streamer .deb installer next to the Dockerfile and build:

docker build --build-arg ODEN_INSTALLER_PATH=./oden-streamer.deb -t oden-streamer:latest .

Running

docker run --runtime nvidia -e NVIDIA_VISIBLE_DEVICES=all \
  --network host --rm -it \
  -v /run/udev:/run/udev:ro \
  -v ./key.conf:/root/.config/oden/Oden_Streamer/key.conf \
  -v ./project:/root/project \
  oden-streamer:latest

--runtime nvidia together with -e NVIDIA_VISIBLE_DEVICES=all is needed for GPU access. Alternatively, you can use --gpus all instead of both flags. --network host is used for network access. /run/udev is mounted read-only for licensing to work. Mount your license key to /root/.config/oden/Oden_Streamer/key.conf. The project file (.vproj) needs to be accessible inside the container - in this example it’s mounted to /root/project which matches the path in the Dockerfile CMD.

Docker Compose

docker-compose.yml
services:
  oden-streamer:
    image: oden-streamer:latest
    network_mode: host
    volumes:
      - /run/udev:/run/udev:ro
      - ./key.conf:/root/.config/oden/Oden_Streamer/key.conf
      - ./project:/root/project
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    runtime: nvidia
docker compose up

Add more volume mounts if needed, e.g. camera devices.

nvunixfd GStreamer Plugin (Jetson)

Oden Streamer can use nvunixfdsrc / nvunixfdsink for zero-copy video IPC on Jetson. On JetPack 5 they are bundled with the Oden Streamer installer, and the .so can be found in /usr/lib/aarch64-linux-gnu/gstreamer-1.0/. On JetPack 6+ they are not included in the Oden Streamer installer and must be installed separately - either install DeepStream (which bundles them) or build from source at voysys/nvunixfd by running make and copying the .so to /usr/lib/aarch64-linux-gnu/gstreamer-1.0/.

The plugin needs to be available inside the container - either install it on the host, bake it into the Docker image, or mount it in.