Image catalogue
All images are built from the monorepo root (context .).
Pyre (the interactive PyQt / OpenGL UI) is not included in any Docker image. Install it on Windows with Pyre-Setup.exe — see Installing Pyre on Windows.
Image tag |
Dockerfile |
Notes |
|---|---|---|
|
|
CuPy ( |
|
|
CPU-only production ( |
|
|
Production + CuPy + cuVS. |
|
|
CuPy + cuVS + pytest + venv without baking the monorepo; base for |
|
|
|
Packages baked into nornir:dev, nornir:prod, and nornir:cupy (from the monorepo at build time):
nornir_shared, nornir_pools, nornir_imageregistration, dm4, nornir_buildmanager.
nornir:cursor-worker and nornir:dev-cursor-base do not bake those; they install editables from /workspace at container start.
The annotation overlay gallery (nornir-annotation-gallery) is a Compose stack, not one of the five docker-build.ps1 tags. It is a stdlib-only image under nornir-docker/annotation-gallery/ and must not install nornir-buildmanager. See Annotation overlay gallery.
Monorepo version and package map
VERSIONat the monorepo root — single-line release id (e.g.1.7.0). Release tags usev+ that value (v1.7.0).release/package-versions.yaml— bill of materials (each distribution version,docker: true/false).release/README.md— release checklist.
Build commands
Recommended (OCI labels + BOM JSON) — run from nornir-docker/ (or any directory; the script captures the current directory before changing to the monorepo root):
.\docker-build.ps1 # PowerShell
build.cmd # cmd
Build only selected tags with -Images (catalogue order; skips everything else).
Names may be short (prod), nornir:prod, or nornir-prod. Selecting
cursor-worker also builds dev-cursor-base first. prod / cupy do
not require nornir:dev:
.\docker-build.ps1 -Images prod,cupy
Force a clean rebuild of those tags:
.\docker-build.ps1 -Images prod,cupy -NoCache
After each successful image, the script prints Id / Created / OCI labels and also tags
nornir:<name>-<VERSION> (from the monorepo VERSION file). docker-push.ps1 prints the
same local metadata before push and warns if the floating tag looks stale.
Optional build-arg overrides: place build.env (shared) and .build.<id>.env per image (<id> is the tag with : replaced by -, e.g. .build.nornir-dev.env) in that invocation directory. The script does not read committed example.*.build.env files; use those files in the repo only as templates.
Minimal samples (Compose / same builds from repo root):
.\nornir-docker\start-sample.ps1 -Sample List
This reads VERSION, git SHA, build time, and embeds a base64-encoded JSON bill of materials.
Manual docker build (from monorepo root):
docker build -f nornir-docker/dev/Dockerfile -t nornir:dev .
docker build -f nornir-docker/prod/Dockerfile -t nornir:prod .
docker build -f nornir-docker/prod/Dockerfile --build-arg INSTALL_CUPY=1 -t nornir:cupy .
Override the CuPy wheel (default cupy-cuda13x). Match cuVS to the same CUDA major
(cuvs-cu12 with cupy-cuda12x):
docker build -f nornir-docker/dev/Dockerfile --build-arg CUPY_PACKAGE=cupy-cuda12x --build-arg CUVS_PACKAGE=cuvs-cu12 -t nornir:dev .
OCI image labels
Images declare OCI annotations
including org.opencontainers.image.version, org.opencontainers.image.revision,
org.opencontainers.image.source, org.opencontainers.image.created,
org.nornir.variant, and org.nornir.package_versions.json.base64
(base64-encoded JSON map of docker-included packages).
Inspect (PowerShell):
docker image inspect nornir:dev --format '{{json .Config.Labels}}'
Decode the BOM:
$b64 = (docker image inspect nornir:dev --format '{{index .Config.Labels "org.nornir.package_versions.json.base64"}}')
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($b64))
Running nornir:dev interactively (bind mounts)
The nornir:dev image bakes the monorepo packages under /opt/nornir at build time.
It does not clone sources into /workspace on start: the default command is bash only,
so WORKDIR /workspace is usually an empty directory unless you mount something there.
Empty ``/workspace`` — If you bind-mount an empty host folder at
/workspace, the container shell will show an empty tree. Mount your actual monorepo checkout instead (same layout as the build context), e.g.-v D:\src\git\nornir:/workspace, then work or re-runpip install -eon packages from/workspaceif you need editables against the mount.Clone into an empty mount — The image ships
/usr/local/bin/cursor-dev-entry.sh(same script used by the Cursor dev compose flow). It is not the defaultCMD; run it explicitly so an empty/workspaceis populated bygit clone(requires network andNORNIR_CLONE_URL/NORNIR_CLONE_BRANCHif you override defaults), then drops into your shell, for example (one line, or use^continuation incmd/ backtick in PowerShell):docker run --rm -it --env-file secrets.env --env-file .env.run.nornir-dev -v "D:\Docker\mounted-configs\nornir-dev:/workspace" -w /workspace nornir:dev /usr/local/bin/cursor-dev-entry.sh bash
If the mount is non-empty and not a git repo, the script refuses to clone (see script error text); use an empty directory or a real checkout.
``/nornir-testdata`` — Nothing in
nornir:devcreates this path. For tests that needTESTINPUTPATH(often/nornir-testdata), add a second read-only bind mount from the host (WSL Linux paths are recommended on Docker Desktop) and set the env vars, e.g. in your env file:TESTINPUTPATH=/nornir-testdata TESTOUTPUTPATH=/tmp/nornir-test-output
compose.cursor-dev.yamlbind-mountsNORNIR_TESTOUTPUT_HOST(defaultD:/nornir-test-output) to that path.and:
-v "//wsl$/Ubuntu/home/you/nornir-testdata:/nornir-testdata:ro"
Or use
docker compose -f nornir-docker/compose.cursor-dev.yaml run --rm cursor-dev, which wiresNORNIR_TESTDATA_HOST,TESTINPUTPATH, andcursor-dev-entry.shfor bind-mounted sources (service cursor-dev), or usecursor-dev-clonefor a named-volume clone (see Cursor / local agent dev shell).
GPU runtime
Use nd-build -Gpu / NORNIR_DOCKER_GPU=1 or docker run --gpus all to expose NVIDIA
devices. A GPU is not required at image build time.