Skip to content

Docker

doppler ships as a small family of purpose-built images — one per thing you'd actually do. Pick by intent:

Image You want to… Published
doppler use doppler — run the CLIs and the demos ghcr.io/doppler-dsp/doppler
doppler-sdk build on doppler — your own C/jm project ghcr.io/doppler-dsp/doppler-sdk
doppler-downstream-jm see a complete worked downstream, running ghcr.io/doppler-dsp/doppler-downstream-jm
compose services run the streaming pipeline built locally by docker compose

All published images are multi-arch (linux/amd64 + linux/arm64) and tagged :X.Y.Z per release plus :latest.

Runtime — try it

The published pull-and-run image: the full Python package with the cli and specan-web extras, numpy/scipy/matplotlib, and the ~70 example scripts under /examples. doppler, doppler-fir, doppler-source, doppler-specan, and wfmgen are all on PATH.

# The runtime "try it" image — doppler installed, ~70 demos under /examples.
docker run --rm ghcr.io/doppler-dsp/doppler:latest python awgn_demo.py
docker run --rm -it ghcr.io/doppler-dsp/doppler:latest   # shell among the demos

Every example asserts its own physics — exit 0 means it ran and checked out. Both platforms install the exact wheel published to PyPI for that release (never rebuilt) — see deploy/docker/Dockerfile.cli.

Pin a release instead of latest, or drive a streaming pipeline at a reachable nats-server:

docker run --rm ghcr.io/doppler-dsp/doppler:X.Y.Z doppler --help
docker run --rm --network host ghcr.io/doppler-dsp/doppler \
    wfmgen --type qpsk --count 4096 --output nats://127.0.0.1:4222/iq

SDK — build on doppler

doppler installed to /usr/local (headers, static and shared library, CMake package config, pkg-config .pc) plus the dev toolchain, uv, and the pinned just-makeit. A downstream find_package(doppler) resolves with no flags. Under /workspace/examples are four real consumers, smallest to largest — consumer/, standalone/, c/, and the full jm project downstream-jm/.

# The SDK image — build your OWN C/jm project on doppler. Pull the published
# image, or build it locally with `make docker-sdk`.
docker run --rm -it ghcr.io/doppler-dsp/doppler-sdk:latest

Then, inside:

cd examples/consumer && cmake -B build && cmake --build build && ./build/consumer_shared

Showcase — a full downstream project

doppler-downstream-jm is iqtools — a real IQ-capture reader, a C library and a generated Python package, built on doppler in ~140 lines of C plus a few manifest tables. The image ships it already built with its whole suite green (building it runs make test); you land in /iqtools ready to explore and re-run the jm codegen loop:

# The iqtools showcase — a full downstream project, shipped pre-built and green.
docker run --rm -it ghcr.io/doppler-dsp/doppler-downstream-jm:latest
just-makeit apply && make test    # regenerate the glue, rebuild, still green

Build any image from source

The build-on-doppler images are driven through the Makefile — the single driver for every docker build here:

# Build any image from this checkout through the Makefile:
make docker-sdk          # doppler-sdk:dev
make docker-downstream   # doppler-downstream-jm:dev
make docker-stream       # doppler-stream-services:dev (used by compose)

Streaming demo — docker compose

docker-compose.yml wires a transmitter, two receivers, and a spectrum analyzer over NATS. Compose builds one lean image (the stream-services target of deploy/docker/Dockerfile.examples, carrying just the statically-linked streaming binaries) and runs all four services on it against a bundled nats-server:

docker compose up

Foreground process

docker compose up runs in the foreground and streams all service logs to the terminal. Use docker compose up -d to detach, then docker compose logs -f to follow logs separately.

docker compose down
Service Description
transmitter Generates and publishes IQ samples over NATS PUB (subject iq)
receiver-1 Subscribes and prints signal stats
receiver-2 Second subscriber (demonstrates NATS PUB/SUB fan-out)
spectrum-analyzer ASCII spectrum display