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:
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
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:
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.
| 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 |