The official image is published to both Docker Hub (
standardws/operator:latest) and GitHub Container Registry (ghcr.io/avrilonline/operator:latest). Both tags are kept in sync on every release.Prerequisites
- Docker Engine 24+ or Docker Desktop
- Docker Compose v2 (
docker compose, notdocker-compose) - An API key for at least one supported LLM provider
Quick start
Generate the default configuration
Run the gateway profile once without On first run the entrypoint detects that neither a config file nor a workspace directory exists, calls
-d to let the entrypoint script create the initial docker/data/config.json file and then exit cleanly:operator onboard, writes the default config.json, prints a reminder to edit it, and exits. The container stops automatically — this is expected.Edit the generated config file
The config file is written to See Configuration overview for the full schema.
docker/data/config.json (mapped from /root/.operator inside the container):Start the gateway in the background
18790.Compose profiles
Thedocker/docker-compose.yml file defines two services, each guarded by a profile:
| Profile | Service | Use case |
|---|---|---|
gateway | operator-gateway | Long-running bot daemon connected to messaging channels |
agent | operator-agent | Interactive one-shot queries from the terminal |
Compose file reference
The minimaldocker/docker-compose.yml used by quick start:
Volume mounts
| Host path | Container path | Purpose |
|---|---|---|
./data | /root/.operator | Config file, workspace, memory, logs |
~/.operator directory is persisted in ./data on the host. This means your agent’s long-term memory, session logs, and configuration survive container restarts and upgrades.
Full-featured image (MCP support)
For workflows that require MCP (Model Context Protocol) servers — which depend on Node.js — use thedocker-compose.full.yml variant. This image is larger but supports the full MCP tool ecosystem.
Environment variable overrides
You can inject provider API keys at runtime without editingconfig.json directly. Copy .env.example to .env and fill in the values you need:
| Variable | Provider |
|---|---|
OPENROUTER_API_KEY | OpenRouter |
ANTHROPIC_API_KEY | Anthropic |
OPENAI_API_KEY | OpenAI |
GEMINI_API_KEY | Google Gemini |
ZHIPU_API_KEY | Zhipu AI |
CEREBRAS_API_KEY | Cerebras |
TELEGRAM_BOT_TOKEN | Telegram |
DISCORD_BOT_TOKEN | Discord |
BRAVE_SEARCH_API_KEY | Brave Search |
TZ | Container timezone |
Port mapping
The gateway HTTP server listens on port18790 inside the container. Docker does not publish this port by default — add a ports entry if you need to access the health endpoint or API from the host:
Building locally
If you want to build the image from source instead of pulling from Docker Hub:docker/Dockerfile compiles the binary in a golang:1.25-alpine builder stage and copies only the resulting binary into the final alpine:3.23 runtime image, keeping the image footprint minimal.