Skip to content

Plain Docker (no Compose)

Everything the Compose files do, as single commands.

docker volume create jeff-models
docker volume create jeff-data

docker run -d --name jeff \
  --restart unless-stopped \
  -p 127.0.0.1:8000:8000 \
  -v jeff-models:/models \
  -v jeff-data:/data \
  -e JEFF_API_KEYS="$(openssl rand -hex 32)" \
  -e JEFF_DEVICE=cpu \
  -e JEFF_THREADS=4 \
  -e JEFF_RATE_LIMIT_RPS=4 \
  --memory 10g \
  --security-opt no-new-privileges:true --cap-drop ALL \
  ghcr.io/tommasomarchionni/jeff-docker:latest

docker logs -f jeff

Read the generated key back with:

docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' jeff | grep JEFF_API_KEYS

Using an env file instead of many -e flags:

docker run -d --name jeff --env-file .env -p 127.0.0.1:8000:8000 \
  -v jeff-models:/models -v jeff-data:/data \
  ghcr.io/tommasomarchionni/jeff-docker:latest

Warning

docker run --env-file does not strip quotes: write JEFF_API_KEYS=abc, not JEFF_API_KEYS="abc".

Bind-mounting a host directory instead of a volume (e.g. to inspect weights): the directory must be writable by UID 10001:

sudo mkdir -p /srv/jeff/models && sudo chown -R 10001:10001 /srv/jeff/models
docker run ... -v /srv/jeff/models:/models ...

Upgrading:

docker pull ghcr.io/tommasomarchionni/jeff-docker:latest
docker rm -f jeff
# re-run the same docker run command; the volumes keep the model