Docker image for OpenClaw - your personal AI assistant.
Built for use with Umbrel and other self-hosted platforms.
View available tags - follows OpenClaw's release cycle using calendar versioning (e.g., v2026.1.30).
- Clone this repository
- Copy
.env.exampleto.envand add your API keys - Run:
docker compose up -ddocker run -d \
-p 18789:18789 \
-e ANTHROPIC_API_KEY=your-key \
-e TELEGRAM_BOT_TOKEN=your-bot-token \
-v openclaw-data:/home/openclaw/.openclaw \
-v openclaw-workspace:/home/openclaw/clawd \
ghcr.io/zot24/openclaw-docker:latest| Channel | Environment Variables | Notes |
|---|---|---|
| Telegram | TELEGRAM_BOT_TOKEN |
Get token from @BotFather |
WHATSAPP_ENABLED=true |
Requires QR code linking | |
| Discord | DISCORD_BOT_TOKEN |
From Discord Developer Portal |
| Slack | SLACK_APP_TOKEN, SLACK_BOT_TOKEN |
Socket mode required |
| MS Teams | MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD |
Azure AD app registration |
| Signal | SIGNAL_NUMBER |
Requires signal-cli (not included) |
| Provider | Environment Variables | Model Example |
|---|---|---|
| Anthropic | ANTHROPIC_API_KEY |
anthropic/claude-sonnet-4 |
| MiniMax | MINIMAX_API_KEY |
minimax/MiniMax-M2.1 |
| OpenAI | OPENAI_API_KEY |
openai/gpt-4o |
| OpenRouter | OPENROUTER_API_KEY |
openrouter/anthropic/claude-sonnet-4 |
| Moonshot | MOONSHOT_API_KEY |
moonshot/moonshot-v1-128k |
| GLM | GLM_API_KEY |
glm/glm-4-plus |
| Local (Ollama, etc.) | OPENCODE_BASE_URL |
opencode/llama3.1 |
The image auto-selects a model based on available API keys. Override with OPENCLAW_MODEL.
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY |
One provider required | Anthropic API key |
MINIMAX_API_KEY |
MiniMax API key | |
OPENAI_API_KEY |
OpenAI API key | |
OPENAI_ORG_ID |
OpenAI organization ID | |
OPENAI_BASE_URL |
OpenAI-compatible endpoint | |
OPENROUTER_API_KEY |
OpenRouter API key | |
MOONSHOT_API_KEY |
Moonshot API key | |
GLM_API_KEY |
GLM/ChatGLM API key | |
OPENCODE_BASE_URL |
Local model endpoint (e.g., Ollama) | |
OPENCODE_API_KEY |
API key for local endpoint | |
OPENCODE_MODEL |
Model name for local provider | |
OPENCLAW_MODEL |
Override auto-selected model |
| Variable | Default | Description |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Telegram bot token | |
TELEGRAM_ALLOWED_USERS |
Comma-separated user IDs | |
OPENCLAW_DM_POLICY |
pairing |
DM policy: pairing, allowlist, open |
WHATSAPP_ENABLED |
false |
Enable WhatsApp channel |
WHATSAPP_DM_POLICY |
pairing |
DM policy |
WHATSAPP_GROUP_POLICY |
disabled |
Group policy: disabled, allowlist |
WHATSAPP_ALLOWED_NUMBERS |
Comma-separated phone numbers | |
WHATSAPP_GROUPS |
Group IDs or * for all |
|
DISCORD_BOT_TOKEN |
Discord bot token | |
DISCORD_ALLOWED_USERS |
Comma-separated user IDs | |
DISCORD_DM_POLICY |
pairing |
DM policy |
SLACK_APP_TOKEN |
Slack app token (xapp-...) | |
SLACK_BOT_TOKEN |
Slack bot token (xoxb-...) | |
SLACK_ALLOWED_USERS |
Comma-separated user IDs | |
MSTEAMS_APP_ID |
Azure AD app ID | |
MSTEAMS_APP_PASSWORD |
Azure AD app password | |
SIGNAL_NUMBER |
Signal phone number |
| Variable | Default | Description |
|---|---|---|
OPENCLAW_GATEWAY_TOKEN |
Auto-generated | Authentication token |
OPENCLAW_GATEWAY_PORT |
18789 |
Gateway port |
GATEWAY_MODE |
local |
Gateway mode: local, cloud |
GATEWAY_BIND |
lan |
Bind mode: lan, loopback, tailnet |
| Variable | Default | Description |
|---|---|---|
AGENT_TIMEOUT |
600 |
Agent timeout in seconds |
AGENT_TIMEZONE |
UTC |
Timezone for agent |
ENABLE_MEMORY_SEARCH |
false |
Enable memory search |
ENABLE_BROWSER |
true |
Enable browser automation |
ENABLE_EXEC |
true |
Enable shell execution |
EXEC_TIMEOUT |
30000 |
Exec timeout in milliseconds |
| Variable | Default | Description |
|---|---|---|
ELEVENLABS_API_KEY |
ElevenLabs API key for TTS | |
SAG_VOICE_ID |
Default voice ID for sag |
| Variable | Default | Description |
|---|---|---|
OPENCLAW_DATA_DIR |
/home/openclaw/.openclaw |
Config and credentials |
OPENCLAW_WORKSPACE |
/home/openclaw/clawd |
Workspace, memory, skills |
- 18789: Gateway (HTTP + WebSocket + WebChat at
/chat) - 18790: Bridge (TCP for mobile nodes)
/home/openclaw/.openclaw: Configuration and credentials/home/openclaw/clawd: Workspace, memory, and skills
- Message @BotFather on Telegram
- Create a new bot with
/newbot - Copy the bot token
- Set
TELEGRAM_BOT_TOKEN=your-token
- Set
WHATSAPP_ENABLED=true - Start the container
- Run
docker exec -it <container> node dist/index.js channels login - Scan the QR code with WhatsApp
- Go to Discord Developer Portal
- Create a new application
- Go to Bot section, create a bot
- Copy the token and set
DISCORD_BOT_TOKEN=your-token - Enable required intents (Message Content, etc.)
- Invite bot to your server with appropriate permissions
- Create a new Slack App at api.slack.com
- Enable Socket Mode
- Add required scopes:
chat:write,app_mentions:read,im:history, etc. - Install to workspace
- Copy App Token (
xapp-...) and Bot Token (xoxb-...) - Set both
SLACK_APP_TOKENandSLACK_BOT_TOKEN
- Register an app in Azure AD
- Configure Bot Framework registration
- Set
MSTEAMS_APP_IDandMSTEAMS_APP_PASSWORD
To use Ollama running on your host machine:
docker run -d \
-p 18789:18789 \
-e OPENCODE_BASE_URL=http://host.docker.internal:11434/v1 \
-e OPENCODE_MODEL=llama3.1 \
-e TELEGRAM_BOT_TOKEN=your-token \
-v openclaw-data:/home/openclaw/.openclaw \
-v openclaw-workspace:/home/openclaw/clawd \
ghcr.io/zot24/openclaw-docker:latestWhen running both OpenClaw and Ollama as Umbrel apps, they communicate via Docker's internal network.
1. Find the Ollama container name:
docker ps | grep ollamaLook for something like ollama_server_1 or ollama_web_1.
2. Find the Umbrel network:
docker network ls | grep umbrel3. Get Ollama's network details:
docker inspect <ollama-container-name> | grep -A5 Networks4. Configure OpenClaw:
Set these environment variables in your OpenClaw configuration:
OPENCODE_BASE_URL=http://<ollama-container-name>:11434/v1
OPENCODE_MODEL=llama3.1Replace <ollama-container-name> with the actual container name from step 1 (e.g., ollama_server_1).
5. Ensure both containers are on the same network:
If OpenClaw can't reach Ollama, connect it to Umbrel's network:
docker network connect <umbrel-network> <openclaw-container>Tip: You can also use Ollama's internal IP address instead of the container name if DNS resolution doesn't work.
This image runs as a dedicated non-root user (openclaw, UID 1000) for enhanced security:
- Principle of Least Privilege: The container process has only the permissions it needs, not full root access
- Container Escape Mitigation: If an attacker exploits a vulnerability in the application, they gain limited user privileges rather than root
- Host System Protection: Volume mounts and any potential breakouts are constrained to non-root permissions
- Compliance: Many security frameworks (CIS Docker Benchmark, PCI-DSS) require or recommend non-root containers
- Defense in Depth: Adds another security layer on top of container isolation
The container uses UID/GID 1000, which matches the default user on most Linux systems, making volume permission management straightforward.
- Browser Automation: Playwright with Chromium for web scraping
- Voice Messages: FFmpeg for audio processing
- Image Processing: ImageMagick for image manipulation
- Shell Execution: Run commands via the exec tool
- Memory Search: Semantic search over conversation history
- Text-to-Speech: ElevenLabs TTS via sag
- Speech-to-Text: OpenAI Whisper for transcription
- MCP Tools: mcporter for Model Context Protocol servers
- Python Tools: uv/uvx for running Python MCP tools
- GitHub CLI: gh for GitHub operations
# Build with docker-compose
docker compose build
# Or build directly
docker build -t openclaw:local .The Dockerfile uses a multi-stage build for optimal caching:
- deps: System packages, Go, Python, global tools (cached)
- builder: Clone and build OpenClaw (rebuilds on version changes)
- runtime: Final image with all tools
| Tool | Purpose |
|---|---|
| Playwright + Chromium | Browser automation and web scraping |
| FFmpeg | Audio/video processing |
| ImageMagick | Image manipulation |
| sag | ElevenLabs TTS CLI |
| whisper | OpenAI speech-to-text |
| mcporter | MCP server management |
| uv/uvx | Python tool runner |
| gh | GitHub CLI |
| xvfb | Virtual framebuffer for headless browsers |
The full-featured image is approximately 1.5-2GB due to:
- Node.js runtime
- Go runtime and sag binary
- Python and uv
- Chromium browser
- FFmpeg and ImageMagick
- OpenClaw and dependencies
This Docker image builds OpenClaw from source. See the original repository for licensing information.