Docker (optional)
Docker ist optional. Nutze es nur, wenn du ein containerisiertes Gateway möchtest oder den Docker-Ablauf prüfen willst.
Passt Docker zu dir?
- Ja: Du willst eine isolierte, wegwerfbare Gateway-Umgebung oder OpenClaw auf einem Host ohne lokale Installationen.
- Nein: Du läufst auf deiner eigenen Maschine und willst nur den schnellsten Dev-Loop. Nutze stattdessen die normale Installation.
- Hinweis Sandboxing: Agent-Sandboxing nutzt ebenfalls Docker, erfordert aber nicht, dass das gesamte Gateway in Docker läuft. Siehe Sandboxing.
Diese Seite behandelt:
- Containerisiertes Gateway — Vollständiges OpenClaw (CLI + Gateway) in Docker.
- Agent-Sandbox — Gateway auf dem Host, Tools laufen in Docker-Containern (einer pro Agent/Session).
Sandbox im Detail: Sandboxing
Voraussetzungen
- Docker Desktop (oder Docker Engine) + Docker Compose v2
- Ausreichend Speicher für Images + Logs
Containerisiertes Gateway (Docker Compose)
Schnellstart (empfohlen)
Aus dem Repo-Root:
./docker-setup.shDieses Skript:
- baut das Gateway-Image
- startet den Onboarding-Wizard
- gibt optionale Hinweise zur Provider-Einrichtung aus
- startet das Gateway per Docker Compose
- erzeugt ein Gateway-Token und schreibt es in
.env
Optionale Umgebungsvariablen:
CLAWDBOT_DOCKER_APT_PACKAGES— zusätzliche apt-Pakete beim Build installierenCLAWDBOT_EXTRA_MOUNTS— zusätzliche Host-Bind-MountsCLAWDBOT_HOME_VOLUME—/home/nodein einem benannten Volume persistieren
Nach dem Durchlauf:
- Öffne
http://127.0.0.1:18789/im Browser. - Token in die Control UI einfügen (Einstellungen → Token).
Es schreibt Config/Workspace auf dem Host:
~/.clawdbot/~/clawd
Läuft auf einem VPS? Siehe Hetzner (Docker VPS).
Manueller Ablauf (Compose)
docker build -t openclaw:local -f Dockerfile .
docker compose run --rm openclaw-cli onboard
docker compose up -d openclaw-gatewayZusätzliche Mounts (optional)
Wenn du weitere Host-Verzeichnisse in die Container mounten willst, setze vor dem Ausführen von docker-setup.sh die Variable CLAWDBOT_EXTRA_MOUNTS. Sie akzeptiert eine kommagetrennte Liste von Docker-Bind-Mounts und wendet sie auf openclaw-gateway und openclaw-cli an, indem docker-compose.extra.yml erzeugt wird. Beispiel:
export CLAWDBOT_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.shHinweise:
- Pfade müssen unter Docker Desktop auf macOS/Windows freigegeben sein.
- Wenn du
CLAWDBOT_EXTRA_MOUNTSänderst, führedocker-setup.sherneut aus, damit die extra Compose-Datei neu erzeugt wird. docker-compose.extra.ymlwird generiert. Nicht von Hand bearbeiten.
Gesamtes Container-Home persistieren (optional)
Wenn /home/node über Container-Neuerstellungen hinweg bestehen soll, setze ein benanntes Volume über CLAWDBOT_HOME_VOLUME. Das erzeugt ein Docker-Volume und mountet es unter /home/node, während die üblichen Config/Workspace-Bind-Mounts erhalten bleiben. Hier ein benanntes Volume verwenden (kein Bind-Pfad); für Bind-Mounts siehe CLAWDBOT_EXTRA_MOUNTS. Beispiel:
export CLAWDBOT_HOME_VOLUME="openclaw_home"
./docker-setup.shKombinierbar mit Extra-Mounts:
export CLAWDBOT_HOME_VOLUME="openclaw_home"
export CLAWDBOT_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.shHinweise:
- Bei Änderung von
CLAWDBOT_HOME_VOLUMEdocker-setup.sherneut ausführen, damit die extra Compose-Datei neu erzeugt wird. - Das benannte Volume bleibt bestehen, bis es mit
docker volume rm <name>entfernt wird.
Zusätzliche apt-Pakete installieren (optional)
Wenn du Systempakete im Image brauchst (z. B. Build-Tools oder Media-Bibliotheken), setze vor docker-setup.sh die Variable CLAWDBOT_DOCKER_APT_PACKAGES. Die Pakete werden beim Image-Build installiert und bleiben auch nach Löschen des Containers. Beispiel:
export CLAWDBOT_DOCKER_APT_PACKAGES="ffmpeg build-essential"
./docker-setup.shHinweise:
- Akzeptiert eine leerzeichengetrennte Liste von apt-Paketnamen.
- Bei Änderung von
CLAWDBOT_DOCKER_APT_PACKAGESdocker-setup.sherneut ausführen, um das Image neu zu bauen.
Schnellere Rebuilds (empfohlen)
Damit Rebuilds schneller gehen, die Dockerfile so anordnen, dass Abhängigkeits-Layer gecacht werden. So wird pnpm install nur bei geänderten Lockfiles erneut ausgeführt:
FROM node:22-bookworm
# Install Bun (required for build scripts)
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"
RUN corepack enable
WORKDIR /app
# Cache dependencies unless package metadata changes
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]Kanal-Einrichtung (optional)
CLI-Container nutzen, um Kanäle zu konfigurieren, dann bei Bedarf das Gateway neu starten. WhatsApp (QR):
docker compose run --rm openclaw-cli channels loginTelegram (Bot-Token):
docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"Discord (Bot-Token):
docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"Doku: WhatsApp, Telegram, Discord
Health-Check
docker compose exec openclaw-gateway node dist/index.js health --token "$CLAWDBOT_GATEWAY_TOKEN"E2E-Smoke-Test (Docker)
scripts/e2e/onboard-docker.shQR-Import-Smoke-Test (Docker)
pnpm test:docker:qrHinweise
- Gateway-Bind standardmäßig
lanfür Container-Nutzung. - Der Gateway-Container ist die Quelle für Sessions (
~/.clawdbot/agents/<agentId>/sessions/).
Agent-Sandbox (Host-Gateway + Docker-Tools)
Im Detail: Sandboxing
Was es macht
Wenn agents.defaults.sandbox aktiviert ist, laufen nicht-main-Sessions mit Tools in einem Docker-Container. Das Gateway bleibt auf dem Host, die Tool-Ausführung ist isoliert:
- scope:
"agent"(Standard) — ein Container + Workspace pro Agent - scope:
"session"— Isolierung pro Session - pro Scope Workspace-Ordner unter
/workspacegemountet - optionaler Agent-Workspace-Zugriff (
agents.defaults.sandbox.workspaceAccess) - Tool-Policy allow/deny (deny gewinnt)
- eingehende Medien werden in den aktiven Sandbox-Workspace kopiert (
media/inbound/*), damit Tools sie lesen können (beiworkspaceAccess: "rw"landen sie im Agent-Workspace)
Warnung: scope: "shared" schaltet die Isolierung zwischen Sessions aus. Alle Sessions teilen sich einen Container und einen Workspace.
Sandbox-Profile pro Agent (Multi-Agent)
Bei Multi-Agent-Routing kann jeder Agent Sandbox- und Tool-Einstellungen überschreiben: agents.list[].sandbox und agents.list[].tools (plus agents.list[].tools.sandbox.tools). So kannst du unterschiedliche Zugriffsstufen in einem Gateway betreiben:
- Voller Zugriff (persönlicher Agent)
- Nur-Lesen-Tools + nur-Lesen-Workspace (Familie/Arbeit)
- Keine Dateisystem-/Shell-Tools (öffentlicher Agent)
Siehe Multi-Agent Sandbox & Tools für Beispiele, Vorrang und Fehlerbehebung.
Standardverhalten
- Image:
openclaw-sandbox:bookworm-slim - Ein Container pro Agent
- Agent-Workspace-Zugriff:
workspaceAccess: "none"(Standard) nutzt~/.clawdbot/sandboxes"ro": Sandbox-Workspace unter/workspace, Agent-Workspace nur lesen unter/agent(deaktiviertwrite/edit/apply_patch)"rw": Agent-Workspace lesen/schreiben unter/workspace
- Auto-Prune: inaktiv > 24 h ODER älter als 7 Tage
- Netzwerk: standardmäßig
none(bei Bedarf explizit egress aktivieren) - Standard allow:
exec,process,read,write,edit,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status - Standard deny:
browser,canvas,nodes,cron,discord,gateway
Sandboxing aktivieren
Wenn du Pakete in setupCommand installieren willst, beachte:
- Standard
docker.networkist"none"(kein Egress). readOnlyRoot: trueverhindert Paketinstallationen.usermuss root sein fürapt-get(userweglassen oderuser: "0:0"setzen). OpenClaw erstellt Container neu, wenn sichsetupCommand(oder Docker-Config) ändert, außer der Container wurde kürzlich genutzt (innerhalb von ca. 5 Minuten). Aktive Container loggen eine Warnung mit dem genauen Befehlopenclaw sandbox recreate ....
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off | non-main | all
scope: "agent", // session | agent | shared (agent is default)
workspaceAccess: "none", // none | ro | rw
workspaceRoot: "~/.clawdbot/sandboxes",
docker: {
image: "openclaw-sandbox:bookworm-slim",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp", "/var/tmp", "/run"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
setupCommand: "apt-get update && apt-get install -y git curl jq",
pidsLimit: 256,
memory: "1g",
memorySwap: "2g",
cpus: 1,
ulimits: {
nofile: { soft: 1024, hard: 2048 },
nproc: 256
},
seccompProfile: "/path/to/seccomp.json",
apparmorProfile: "openclaw-sandbox",
dns: ["1.1.1.1", "8.8.8.8"],
extraHosts: ["internal.service:10.0.0.5"]
},
prune: {
idleHours: 24, // 0 disables idle pruning
maxAgeDays: 7 // 0 disables max-age pruning
}
}
}
},
tools: {
sandbox: {
tools: {
allow: ["exec", "process", "read", "write", "edit", "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status"],
deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"]
}
}
}
}Hardening-Optionen liegen unter agents.defaults.sandbox.docker: network, user, pidsLimit, memory, memorySwap, cpus, ulimits, seccompProfile, apparmorProfile, dns, extraHosts. Multi-Agent: pro Agent überschreiben via agents.list[].sandbox.{docker,browser,prune}.* (ignoriert, wenn agents.defaults.sandbox.scope / agents.list[].sandbox.scope auf "shared" steht).
Standard-Sandbox-Image bauen
scripts/sandbox-setup.shDas baut openclaw-sandbox:bookworm-slim mit Dockerfile.sandbox.
Sandbox-Common-Image (optional)
Wenn du ein Sandbox-Image mit gängigen Build-Tools (Node, Go, Rust usw.) willst, baue das Common-Image:
scripts/sandbox-common-setup.shDas baut openclaw-sandbox-common:bookworm-slim. Nutzung:
{
agents: { defaults: { sandbox: { docker: { image: "openclaw-sandbox-common:bookworm-slim" } } } }
}Sandbox-Browser-Image
Damit das Browser-Tool in der Sandbox läuft, das Browser-Image bauen:
scripts/sandbox-browser-setup.shDas baut openclaw-sandbox-browser:bookworm-slim mit Dockerfile.sandbox-browser. Der Container läuft mit Chromium und CDP sowie optional noVNC-Observer (headful via Xvfb). Hinweise:
- Headful (Xvfb) reduziert Bot-Blocking gegenüber headless.
- Headless bleibt nutzbar über
agents.defaults.sandbox.browser.headless=true. - Kein vollständiges Desktop-Environment (GNOME) nötig; Xvfb liefert die Anzeige.
Config:
{
agents: {
defaults: {
sandbox: {
browser: { enabled: true }
}
}
}
}Eigenes Browser-Image:
{
agents: {
defaults: {
sandbox: { browser: { image: "my-openclaw-browser" } }
}
}
}Wenn aktiviert, erhält der Agent:
- eine Sandbox-Browser-Steuerungs-URL (für das
browser-Tool) - eine noVNC-URL (falls aktiviert und headless=false)
Denk dran: Bei einer Allowlist für Tools browser hinzufügen (und aus deny entfernen), sonst bleibt das Tool blockiert. Prune-Regeln (agents.defaults.sandbox.prune) gelten auch für Browser-Container.
Eigenes Sandbox-Image
Eigenes Image bauen und in der Config referenzieren:
docker build -t my-openclaw-sbx -f Dockerfile.sandbox .{
agents: {
defaults: {
sandbox: { docker: { image: "my-openclaw-sbx" } }
}
}
}Tool-Policy (allow/deny)
denygewinnt gegenüberallow.- Wenn
allowleer ist: alle Tools (außer deny) verfügbar. - Wenn
allownicht leer ist: nur die inallowgenannten Tools (minus deny).
Pruning-Strategie
Zwei Stellschrauben:
prune.idleHours: Container entfernen, die seit X Stunden ungenutzt sind (0 = deaktiviert)prune.maxAgeDays: Container älter als X Tage entfernen (0 = deaktiviert)
Beispiel:
- Aktive Sessions behalten, Lebensdauer begrenzen:
idleHours: 24,maxAgeDays: 7 - Nie prunen:
idleHours: 0,maxAgeDays: 0
Sicherheitshinweise
- Die harte Grenze gilt nur für Tools (exec/read/write/edit/apply_patch).
- Host-only-Tools wie browser/camera/canvas sind standardmäßig blockiert.
browserin der Sandbox zu erlauben bricht die Isolierung (Browser läuft auf dem Host).
Fehlerbehebung
- Image fehlt: bauen mit
scripts/sandbox-setup.shoderagents.defaults.sandbox.docker.imagesetzen. - Container läuft nicht: wird pro Session bei Bedarf automatisch erstellt.
- Berechtigungsfehler in der Sandbox:
docker.userauf UID:GID setzen, die zum gemounteten Workspace passt (oder Workspace-Ordner chown). - Eigene Tools nicht gefunden: OpenClaw führt Befehle mit
sh -lc(Login-Shell) aus, die/etc/profilelädt und PATH zurücksetzen kann.docker.env.PATHsetzen, um eigene Tool-Pfade voranzustellen (z. B./custom/bin:/usr/local/share/npm-global/bin), oder ein Skript unter/etc/profile.d/im Dockerfile hinzufügen.