Skip to main content

Docker Deployment

Run Sinaptic® DROID+ in production with Docker. The official image is minimal (<15MB), runs as non-root, and includes a built-in healthcheck.

Images

RegistryImagePull command
Docker Hub (primary)sinapticai/droiddocker pull sinapticai/droid:latest
GHCR (mirror)ghcr.io/sinapticai/droiddocker pull ghcr.io/sinapticai/droid:latest

Tags: latest, 0.5.0, 0.5, 0 (semver), plus sha-<commit> for pinning.

Quick Start

docker run -d \
--name droid \
-p 8080:8080 \
-p 8081:8081 \
-v ./droid.yaml:/etc/droid/droid.yaml \
-v ./configs/agents:/etc/droid/agents \
-e OPENAI_API_KEY=$OPENAI_API_KEY \
sinapticai/droid

This starts Sinaptic® DROID+ with:

  • Port 8080: OpenAI-compatible API
  • Port 8081: Management API + Agent Builder UI
  • Your local config and agent files mounted into the container
  • API key passed via environment variable

Configuration

The container expects two paths:

PathPurposeDefault
/etc/droid/droid.yamlRuntime configRequired (mount your own)
/var/lib/droidData directory (RAG, logs, audit)Created automatically

Override the config path with DROID_CONFIG and the data directory with DROID_DATA_DIR environment variables.

Environment Variables

Pass API keys and overrides via environment variables. The config file supports ${VAR} syntax:

docker run -d \
-e OPENAI_API_KEY=sk-... \
-e ANTHROPIC_API_KEY=sk-ant-... \
-e GEMINI_API_KEY=AIza... \
-e GROK_API_KEY=xai-... \
sinapticai/droid

Docker Compose

For production deployments, use Docker Compose:

# docker-compose.yml
version: "3.8"

services:
droid:
image: sinapticai/droid:latest
ports:
- "8080:8080" # OpenAI-compatible API
- "8081:8081" # Management API + Builder UI
volumes:
- ./droid.yaml:/etc/droid/droid.yaml:ro
- ./configs/agents:/etc/droid/agents:ro
- droid-data:/var/lib/droid
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
restart: unless-stopped
healthcheck:
test: ["/usr/local/bin/droid", "health", "--openai-port", "8080"]
interval: 30s
timeout: 3s
start_period: 5s
retries: 3

volumes:
droid-data:

Start:

docker compose up -d

Health Checks

The container includes a built-in healthcheck that runs droid health every 30 seconds. You can also check health manually:

# From outside the container
curl http://localhost:8081/health

# Docker inspect
docker inspect --format='{{.State.Health.Status}}' droid

Production Recommendations

Volumes

Mount your config as read-only (:ro) and use a named volume for data:

-v ./droid.yaml:/etc/droid/droid.yaml:ro
-v ./configs/agents:/etc/droid/agents:ro
-v droid-data:/var/lib/droid

Security

The container runs as non-root by default (distroless image). For additional security:

  • Don't expose port 8081 publicly — the Management API and Builder UI are for internal use
  • Use Docker secrets or a vault for API keys instead of environment variables
  • Enable SinapticAI in block mode for all production agents
# Only expose the API port externally
ports:
- "8080:8080"
# Keep 8081 on internal network only

Resource Limits

Sinaptic® DROID+ itself is lightweight, but LLM responses can consume memory during streaming. Recommended minimums:

deploy:
resources:
limits:
memory: 512M
cpus: "1.0"
reservations:
memory: 128M
cpus: "0.25"

Logging

Sinaptic® DROID+ outputs structured JSON logs to stdout by default. Capture with your preferred log aggregator:

logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

Networking

If running multiple Sinaptic® DROID+ instances or connecting to local LLMs (Ollama, LM Studio):

services:
droid:
# ... droid config ...
networks:
- droid-net

ollama:
image: ollama/ollama:latest
networks:
- droid-net

networks:
droid-net:
driver: bridge

Then reference Ollama by service name in droid.yaml:

ollama:
base_url: "http://ollama:11434/v1"

Updating

docker pull sinapticai/droid:latest
docker compose up -d

The container is stateless — all configuration is in mounted files and all data is in the volume. You can safely replace the container at any time.

Building from Source

If you prefer to build the Docker image yourself:

git clone https://github.com/SinapticAI/droid-community.git
cd droid-community
docker build -t droid:local .

Troubleshooting

Container exits immediately: Check logs with docker logs droid. Most common cause: missing or invalid droid.yaml.

Health check failing: Ensure port 8080 is accessible inside the container and the config file is valid YAML.

Can't connect to local LLM: If Ollama or LM Studio runs on the host, use host.docker.internal instead of localhost:

ollama:
base_url: "http://host.docker.internal:11434/v1"

Permission denied on volumes: The container runs as non-root. Ensure mounted directories are readable by UID 65534 (nobody).