Symptom card

your container will show unhealthy while serving perfectly

The llama.cpp server image ships a healthcheck aimed at port 8080; start the server on another port and Docker marks the container unhealthy while it serves fine. Keep 8080 inside the container or override the check.

Platform:
Any local stack
Runtime:
llama.cpp server (Docker)
Published:
9/2/2026

What you see

docker ps marks a running llama.cpp server container unhealthy while the server behind it answers every real request. Restarting the container changes nothing. docker inspect shows the built-in healthcheck probing localhost:8080/health, and the server was started with --port set to something else.

Where we saw it

One of the lab boxes, mid-August 2026: two freshly deployed test models, started on ports 8090 and 8091. Both containers showed unhealthy while serving. The deployment guide links that incident as the trap in its own Strix Halo path, which runs ghcr.io/ggml-org/llama.cpp:server-vulkan on a Ryzen AI Max+ 395 box. Neither page records a build number for the image; the guide pulls it by tag and tells you to re-pull by digest once it works.

Cause

The image ships a default healthcheck that probes localhost:8080/health inside the container. Pass a different --port and the server listens there while the probe keeps asking 8080. Nobody answers, Docker stamps unhealthy into the status column, and the column has no color for “the probe is misconfigured”, only for “dead”. A restarted container inherits the same probe, so it fails the same way.

Fix

Two options from the guide: keep the internal port at 8080, or override the healthcheck. The guide’s serving command does the first, --port 8080 inside the container, published as -p 8080:8080:

docker run -d --name llm-server \
  --device /dev/dri --device /dev/kfd \
  -v /var/lib/llm/models:/models \
  -p 8080:8080 \
  ghcr.io/ggml-org/llama.cpp:server-vulkan \
  -m /models/YOUR-MODEL.gguf \
  -ngl 999 -fa on -c 32768 \
  --host 0.0.0.0 --port 8080 --jinja

If you must move --port, override the healthcheck to match; the guide does not print that override. Then ask the process, not your command line, on the host port you published (8080 with the guide’s -p 8080:8080):

curl -s localhost:8080/props | python3 -m json.tool | head -40

That shows what the process runs: n_ctx, the model path, the slot count. Whether it answers is the guide’s next step, a real chat completion checked for non-empty content and a stop finish reason.

Inside the lab harness the rule became: health checks target the exact endpoint and port a cell is configured to use, and fail fast when it does not answer.

Still open upstream?

Not tracked by us. Neither source page names an upstream issue.

Evidence

Sources

This card documents one failure observed on the lab’s own hardware; any numbers live on the linked source page, not here.

← All symptom cards