# Docker

> Run the server in a container on a GPU host.

Source: https://opendecisio.com/docs/quickstart/docker/

The container is the GPU server with its dependencies pinned, started with Docker Compose. It serves the default base, Gemma 4 31B, and needs the NVIDIA Container Toolkit and a GPU host.

 

[Figure: Build the wheel, bring the container up, wait for /health. Docker: build the wheel, run docker compose up --build, and /health answers once the checkpoint is fetched: first start, with download 10 min 51 s; from the cached volume 3 min 26 s (the Qwen base, the container's default then).]

 

## TL;DR

 

```
# the image installs this wheel
uv build --wheel
# needs the NVIDIA Container Toolkit and a GPU host
docker compose up --build
# answers once the first start has fetched the checkpoint
curl http://127.0.0.1:8000/health
```

 

Needs a GPU host with the NVIDIA Container Toolkit: taken verbatim from the repository's tested docs, [run record](https://github.com/aminry/decisio/tree/v0.11.1/runs/2026-10-01_docker-first-gpu-start). Its comments are shown above their commands.

  

| Word | Meaning |
| --- | --- |
| wheel | the Python package the image installs, built by `uv build --wheel` |
| NVIDIA Container Toolkit | what lets a container see the card |
| volume | `decisio-data`, where the first start downloads the checkpoint, so it is never part of the image |

 

Common mistake

Before 0.10.0 the container served the Qwen base; it now serves the 31B, which needs a 96 GB card. To keep the Qwen base set `DECISIO_BASE=qwen3.6-35b-a3b` ([Upgrading](https://opendecisio.com/docs/upgrading/)).

 

## How the container starts

 

```
# the image installs this wheel
uv build --wheel
# needs the NVIDIA Container Toolkit and a GPU host
docker compose up --build
# answers once the first start has fetched the checkpoint
curl http://127.0.0.1:8000/health
```

 

Needs a GPU host with the NVIDIA Container Toolkit: taken verbatim from the repository's tested docs, [run record](https://github.com/aminry/decisio/tree/v0.11.1/runs/2026-10-01_docker-first-gpu-start). Its comments are shown above their commands.

 

- The image is vLLM's 0.30.0 release image, pinned by digest, plus the decisio wheel with its `serve` extra; the build argument `APPLY_PATCHES=1` adds the patch series (off by default).
- The first start downloads the checkpoint into the `decisio-data` volume, mounted at `/data`; it is never part of the image.
- The container runs as a non-root user, and compose publishes the port on 127.0.0.1 only.
- The entrypoint starts the server with `--base "${DECISIO_BASE:-gemma-4-31b}"` and `--model-class hidden-readout`, listening on `DECISIO_HOST` and `DECISIO_PORT`; arguments after the image name are passed to the server. `DECISIO_BASE` names another base (`qwen3.6-35b-a3b`, `gemma-4-12b`) or a decisio repository, and `DECISIO_MODEL` names a checkpoint instead: alone it brings the base its `config.json` declares, so a container configured with `DECISIO_MODEL=Qwen/Qwen3.6-35B-A3B-FP8` keeps serving the Qwen base.
- It checks for an NVIDIA GPU first and exits with an explanation when the container cannot see one.
- Release images go to `ghcr.io/aminry/decisio`, with their digest in the release notes; to run one instead of building, replace `build:` in [`compose.yaml`](https://github.com/aminry/decisio/blob/v0.11.1/compose.yaml) with `image: ghcr.io/aminry/decisio@sha256:<digest>`.
- [`Dockerfile`](https://github.com/aminry/decisio/tree/v0.11.1/Dockerfile) and [`compose.yaml`](https://github.com/aminry/decisio/blob/v0.11.1/compose.yaml) explain the rest.

 

First GPU start (2026-10-01, one RTX PRO 6000 Blackwell, the image built on the machine from the [`Dockerfile`](https://github.com/aminry/decisio/tree/v0.11.1/Dockerfile)): healthy in 651 s including the checkpoint download and in 206 s from the cached volume, and the README's example request and the conformance gates C2 to C4 pass against the container ([`runs/2026-10-01_docker-first-gpu-start/`](https://github.com/aminry/decisio/tree/v0.11.1/runs/2026-10-01_docker-first-gpu-start)). The image published with v0.1.0 repeated the start from its digest: healthy in 223 s with the checkpoint cached, example and conformance passing (`pushed_image_0.1.0/` in the same record). Those starts were with the Qwen base, the container's default then. The no-flag vLLM start selected Gemma 4 31B on 2026-10-08 on one RTX PRO 6000 Blackwell at 600 W and AMD EPYC 9654, using decisio 0.9.0 at the PR head; `/health` recorded `base: gemma-4-31b`, and the README request produced one distinct response in 30 repeats (RLCD `experiments/2026-10-08_lab2_gate_session/results/box/session_a/`). The same start through a built 0.10.0 container remains to be recorded.

 

## What next

 

- [Deploying and operating](https://opendecisio.com/docs/operating/): restart policies, tasks across restarts and security.
- [Upgrading](https://opendecisio.com/docs/upgrading/): what changed in a release for a running deployment.
- [GPU server](https://opendecisio.com/docs/quickstart/gpu-server/): the same server without the container.
