Containers

Docker

Docker ist optional. Verwenden Sie es nur, wenn Sie ein containerisiertes Gateway möchten oder den Docker-Ablauf validieren wollen.

Ist Docker das Richtige für mich?

  • Ja: Sie möchten eine isolierte, temporäre Gateway-Umgebung oder OpenClaw auf einem Host ohne lokale Installationen ausführen.
  • Nein: Sie arbeiten auf Ihrem eigenen Rechner und möchten nur den schnellsten Entwicklungsablauf. Verwenden Sie stattdessen den normalen Installationsablauf.
  • Hinweis zum Sandboxing: Das standardmäßige Sandbox-Backend verwendet Docker, wenn Sandboxing aktiviert ist, aber Sandboxing ist standardmäßig deaktiviert und erfordert nicht, dass das gesamte Gateway in Docker ausgeführt wird. SSH- und OpenShell-Sandbox-Backends sind ebenfalls verfügbar. Siehe Sandboxing.

Voraussetzungen

  • Docker Desktop (oder Docker Engine) + Docker Compose v2
  • Mindestens 2 GB RAM für den Image-Build (pnpm install kann auf Hosts mit 1 GB RAM per OOM mit Exit 137 beendet werden)
  • Ausreichend Speicherplatz für Images und Logs
  • Wenn Sie auf einem VPS/öffentlichen Host arbeiten, lesen Sie Sicherheitshärtung für Netzwerkexposition, insbesondere die Docker-Firewall-Richtlinie DOCKER-USER.

Containerisiertes Gateway

  • Image erstellen

    Führen Sie im Repo-Root das Setup-Skript aus:

    ./scripts/docker/setup.sh
    

    Dadurch wird das Gateway-Image lokal erstellt. Um stattdessen ein vorab erstelltes Image zu verwenden:

    export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
    ./scripts/docker/setup.sh
    

    Vorab erstellte Images werden in der GitHub Container Registry veröffentlicht. Häufige Tags: main, latest, <version> (z. B. 2026.2.26).

  • Onboarding abschließen

    Das Setup-Skript führt das Onboarding automatisch aus. Es wird:

    • nach Provider-API-Schlüsseln fragen
    • ein Gateway-Token generieren und in .env schreiben
    • das Gateway über Docker Compose starten

    Während des Setups laufen Pre-Start-Onboarding und Konfigurationsschreibvorgänge direkt über openclaw-gateway. openclaw-cli ist für Befehle vorgesehen, die Sie ausführen, nachdem der Gateway-Container bereits existiert.

  • Control UI öffnen

    Öffnen Sie http://127.0.0.1:18789/ in Ihrem Browser und fügen Sie das konfigurierte Shared Secret in den Einstellungen ein. Das Setup-Skript schreibt standardmäßig ein Token in .env; wenn Sie die Container-Konfiguration auf Passwortauthentifizierung umstellen, verwenden Sie stattdessen dieses Passwort.

    Benötigen Sie die URL noch einmal?

    docker compose run --rm openclaw-cli dashboard --no-open
    
  • Kanäle konfigurieren (optional)

    Verwenden Sie den CLI-Container, um Messaging-Kanäle hinzuzufügen:

    # WhatsApp (QR)
    docker compose run --rm openclaw-cli channels login
    
    # Telegram
    docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"
    
    # Discord
    docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"
    

    Doku: WhatsApp, Telegram, Discord

  • Manueller Ablauf

    Wenn Sie jeden Schritt lieber selbst ausführen möchten, anstatt das Setup-Skript zu verwenden:

    docker build -t openclaw:local -f Dockerfile .
    docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
      dist/index.js onboard --mode local --no-install-daemon
    docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
      dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'
    docker compose up -d openclaw-gateway
    

    Umgebungsvariablen

    Das Setup-Skript akzeptiert diese optionalen Umgebungsvariablen:

    Variable Zweck
    OPENCLAW_IMAGE Ein Remote-Image statt eines lokalen Builds verwenden
    OPENCLAW_DOCKER_APT_PACKAGES Zusätzliche apt-Pakete während des Builds installieren (durch Leerzeichen getrennt)
    OPENCLAW_EXTENSIONS Ausgewählte gebündelte Plugin-Helfer zur Build-Zeit einbinden
    OPENCLAW_EXTRA_MOUNTS Zusätzliche Host-Bind-Mounts (kommagetrennt source:target[:opts])
    OPENCLAW_HOME_VOLUME /home/node in einem benannten Docker-Volume persistieren
    OPENCLAW_SANDBOX Sandbox-Bootstrap aktivieren (1, true, yes, on)
    OPENCLAW_SKIP_ONBOARDING Den interaktiven Onboarding-Schritt überspringen (1, true, yes, on)
    OPENCLAW_DOCKER_SOCKET Docker-Socket-Pfad überschreiben
    OPENCLAW_DISABLE_BONJOUR Bonjour-/mDNS-Ankündigung deaktivieren (für Docker standardmäßig 1)
    OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS Bind-Mount-Overlays für gebündelte Plugin-Quellen deaktivieren
    OTEL_EXPORTER_OTLP_ENDPOINT Gemeinsamer OTLP/HTTP-Collector-Endpunkt für OpenTelemetry-Export
    OTEL_EXPORTER_OTLP_*_ENDPOINT Signalspezifische OTLP-Endpunkte für Traces, Metriken oder Logs
    OTEL_EXPORTER_OTLP_PROTOCOL OTLP-Protokollüberschreibung. Heute wird nur http/protobuf unterstützt
    OTEL_SERVICE_NAME Dienstname für OpenTelemetry-Ressourcen
    OTEL_SEMCONV_STABILITY_OPT_IN Neueste experimentelle semantische GenAI-Attribute aktivieren
    OPENCLAW_OTEL_PRELOADED Start eines zweiten OpenTelemetry SDK überspringen, wenn bereits eines vorgeladen ist

    Maintainer können gebündelte Plugin-Quellen gegen ein paketiertes Image testen, indem sie ein Plugin-Quellverzeichnis über dessen paketierten Quellpfad mounten, zum Beispiel OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. Dieses gemountete Quellverzeichnis überschreibt das passende kompilierte /app/dist/extensions/synology-chat-Bundle für dieselbe Plugin-ID.

    Observability

    Der OpenTelemetry-Export erfolgt ausgehend vom Gateway-Container zu Ihrem OTLP- Collector. Er erfordert keinen veröffentlichten Docker-Port. Wenn Sie das Image lokal erstellen und den gebündelten OpenTelemetry-Exporter im Image verfügbar haben möchten, binden Sie seine Laufzeitabhängigkeiten ein:

    export OPENCLAW_EXTENSIONS="diagnostics-otel"
    export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
    export OTEL_SERVICE_NAME="openclaw-gateway"
    ./scripts/docker/setup.sh
    

    Installieren Sie das offizielle Plugin @openclaw/diagnostics-otel aus ClawHub in paketierten Docker-Installationen, bevor Sie den Export aktivieren. Benutzerdefinierte aus dem Quellcode erstellte Images können die lokale Plugin-Quelle weiterhin mit OPENCLAW_EXTENSIONS=diagnostics-otel einbinden. Um den Export zu aktivieren, erlauben und aktivieren Sie das Plugin diagnostics-otel in der Konfiguration, und setzen Sie dann diagnostics.otel.enabled=true oder verwenden Sie das Konfigurationsbeispiel in OpenTelemetry- Export. Collector-Auth-Header werden über diagnostics.otel.headers konfiguriert, nicht über Docker-Umgebungsvariablen.

    Prometheus-Metriken verwenden den bereits veröffentlichten Gateway-Port. Installieren Sie clawhub:@openclaw/diagnostics-prometheus, aktivieren Sie das Plugin diagnostics-prometheus, und scrapen Sie dann:

    http://<gateway-host>:18789/api/diagnostics/prometheus
    

    Die Route ist durch Gateway-Authentifizierung geschützt. Stellen Sie keinen separaten öffentlichen /metrics-Port und keinen nicht authentifizierten Reverse-Proxy-Pfad bereit. Siehe Prometheus-Metriken.

    Health Checks

    Container-Probe-Endpunkte (keine Authentifizierung erforderlich):

    curl -fsS http://127.0.0.1:18789/healthz   # liveness
    curl -fsS http://127.0.0.1:18789/readyz     # readiness
    

    Das Docker-Image enthält einen integrierten HEALTHCHECK, der /healthz anpingt. Wenn Prüfungen weiterhin fehlschlagen, markiert Docker den Container als unhealthy, und Orchestrierungssysteme können ihn neu starten oder ersetzen.

    Authentifizierter Deep-Health-Snapshot:

    docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"
    

    LAN vs. loopback

    scripts/docker/setup.sh setzt standardmäßig OPENCLAW_GATEWAY_BIND=lan, damit Host-Zugriff auf http://127.0.0.1:18789 mit Docker-Port-Veröffentlichung funktioniert.

    • lan (Standard): Host-Browser und Host-CLI können den veröffentlichten Gateway-Port erreichen.
    • loopback: Nur Prozesse innerhalb des Container-Netzwerk-Namespace können das Gateway direkt erreichen.

    Host Local Providers

    Wenn OpenClaw in Docker ausgeführt wird, ist 127.0.0.1 innerhalb des Containers der Container selbst, nicht Ihr Host-Rechner. Verwenden Sie host.docker.internal für AI-Provider, die auf dem Host laufen:

    Provider Standard-Host-URL Docker-Setup-URL
    LM Studio http://127.0.0.1:1234 http://host.docker.internal:1234
    Ollama http://127.0.0.1:11434 http://host.docker.internal:11434

    Das gebündelte Docker-Setup verwendet diese Host-URLs als Onboarding-Standardwerte für LM Studio und Ollama, und docker-compose.yml ordnet host.docker.internal dem Docker-Host-Gateway für Linux Docker Engine zu. Docker Desktop stellt denselben Hostnamen unter macOS und Windows bereits bereit.

    Host-Dienste müssen außerdem auf einer aus Docker erreichbaren Adresse lauschen:

    lms server start --port 1234 --bind 0.0.0.0
    OLLAMA_HOST=0.0.0.0:11434 ollama serve
    

    Wenn Sie Ihre eigene Compose-Datei oder einen eigenen docker run-Befehl verwenden, fügen Sie dieselbe Host- Zuordnung selbst hinzu, zum Beispiel --add-host=host.docker.internal:host-gateway.

    Bonjour / mDNS

    Docker-Bridge-Networking leitet Bonjour-/mDNS-Multicast (224.0.0.251:5353) normalerweise nicht zuverlässig weiter. Das gebündelte Compose-Setup setzt daher standardmäßig OPENCLAW_DISABLE_BONJOUR=1, damit das Gateway keine Crash-Loop ausführt oder die Ankündigung wiederholt neu startet, wenn die Bridge Multicast-Verkehr verwirft.

    Verwenden Sie die veröffentlichte Gateway-URL, Tailscale oder Wide-Area DNS-SD für Docker-Hosts. Setzen Sie OPENCLAW_DISABLE_BONJOUR=0 nur, wenn Sie mit Host-Networking, macvlan oder einem anderen Netzwerk arbeiten, in dem mDNS-Multicast bekanntermaßen funktioniert.

    Gotchas und Fehlerbehebung finden Sie unter Bonjour-Erkennung.

    Speicher und Persistenz

    Docker Compose bind-mountet OPENCLAW_CONFIG_DIR nach /home/node/.openclaw und OPENCLAW_WORKSPACE_DIR nach /home/node/.openclaw/workspace, sodass diese Pfade Container-Ersetzungen überdauern. Wenn eine der Variablen nicht gesetzt ist, fällt das gebündelte docker-compose.yml auf ${HOME}/.openclaw (und ${HOME}/.openclaw/workspace für den Workspace-Mount) zurück, oder auf /tmp/.openclaw, wenn HOME selbst ebenfalls fehlt. Dadurch wird verhindert, dass docker compose up in leeren Umgebungen eine Volume-Spezifikation mit leerer Quelle ausgibt.

    In diesem gemounteten Konfigurationsverzeichnis speichert OpenClaw:

    • openclaw.json für Verhaltenskonfiguration
    • agents/<agentId>/agent/auth-profiles.json für gespeicherte Provider-OAuth-/API-Key-Authentifizierung
    • .env für env-gestützte Laufzeitgeheimnisse wie OPENCLAW_GATEWAY_TOKEN

    Installierte herunterladbare Plugins speichern ihren Paketstatus im gemounteten OpenClaw-Home, sodass Plugin-Installationsdatensätze und Paket-Roots Container- Ersetzungen überdauern. Der Gateway-Start erzeugt keine Abhängigkeitsbäume für gebündelte Plugins.

    Vollständige Persistenzdetails zu VM-Bereitstellungen finden Sie unter Docker VM Runtime - Was wo persistiert.

    Hotspots für Festplattenwachstum: beobachten Sie media/, Sitzungs-JSONL-Dateien, cron/runs/*.jsonl, installierte Plugin-Paket-Roots und rollierende Datei-Logs unter /tmp/openclaw/.

    Shell-Helfer (optional)

    Installieren Sie für einfachere tägliche Docker-Verwaltung ClawDock:

    mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.sh
    echo 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc
    

    Wenn Sie ClawDock über den älteren Raw-Pfad scripts/shell-helpers/clawdock-helpers.sh installiert haben, führen Sie den obigen Installationsbefehl erneut aus, damit Ihre lokale Helferdatei den neuen Speicherort nachverfolgt.

    Verwenden Sie dann clawdock-start, clawdock-stop, clawdock-dashboard usw. Führen Sie clawdock-help aus, um alle Befehle anzuzeigen. Siehe ClawDock für die vollständige Helferanleitung.

    Agent-Sandbox für Docker-Gateway aktivieren
    export OPENCLAW_SANDBOX=1
    ./scripts/docker/setup.sh
    

    Benutzerdefinierter Socket-Pfad (z. B. rootless Docker):

    export OPENCLAW_SANDBOX=1
    export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock
    ./scripts/docker/setup.sh
    

    Das Skript bindet docker.sock erst ein, nachdem die Sandbox-Voraussetzungen erfüllt sind. Wenn die Sandbox-Einrichtung nicht abgeschlossen werden kann, setzt das Skript agents.defaults.sandbox.mode auf off zurück.

    Automatisierung / CI (nicht interaktiv)

    Deaktivieren Sie die Compose-Pseudo-TTY-Zuweisung mit -T:

    docker compose run -T --rm openclaw-cli gateway probe
    docker compose run -T --rm openclaw-cli devices list --json
    
    Sicherheitshinweis zum gemeinsamen Netzwerk

    openclaw-cli verwendet network_mode: "service:openclaw-gateway", damit CLI- Befehle das Gateway über 127.0.0.1 erreichen können. Behandeln Sie dies als gemeinsame Vertrauensgrenze. Die Compose-Konfiguration entfernt NET_RAW/NET_ADMIN und aktiviert no-new-privileges sowohl für openclaw-gateway als auch für openclaw-cli.

    Berechtigungen und EACCES

    Das Image läuft als node (uid 1000). Wenn Berechtigungsfehler für /home/node/.openclaw auftreten, stellen Sie sicher, dass Ihre Host-Bind-Mounts uid 1000 gehören:

    sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace
    

    Dieselbe Abweichung kann als Plugin-Warnung wie blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root) gefolgt von plugin present but blocked erscheinen. Das bedeutet, dass die Prozess-uid und der Besitzer des eingebundenen Plugin-Verzeichnisses nicht übereinstimmen. Führen Sie den Container vorzugsweise mit der Standard-uid 1000 aus und korrigieren Sie den Besitz des Bind-Mounts. Führen Sie chown für /path/to/openclaw-config/npm nur dann auf root:root aus, wenn Sie OpenClaw absichtlich langfristig als root ausführen.

    Schnellere Rebuilds

    Ordnen Sie Ihr Dockerfile so an, dass Dependency-Layer gecacht werden. Dadurch wird vermieden, dass pnpm install erneut ausgeführt wird, sofern sich Lockfiles nicht ändern:

    FROM node:24-bookworm
    RUN curl -fsSL https://bun.sh/install | bash
    ENV PATH="/root/.bun/bin:${PATH}"
    RUN corepack enable
    WORKDIR /app
    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"]
    
    Container-Optionen für Power-User

    Das Standard-Image ist sicherheitsorientiert und läuft als Nicht-root-node. Für einen umfangreicher ausgestatteten Container:

    1. /home/node persistieren: export OPENCLAW_HOME_VOLUME="openclaw_home"
    2. System-Deps einbacken: export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq"
    3. Playwright-Browser installieren:
      docker compose run --rm openclaw-cli \
        node /app/node_modules/playwright-core/cli.js install chromium
      
    4. Browser-Downloads persistieren: setzen Sie PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright und verwenden Sie OPENCLAW_HOME_VOLUME oder OPENCLAW_EXTRA_MOUNTS.
    OpenAI Codex OAuth (Headless-Docker)

    Wenn Sie im Assistenten OpenAI Codex OAuth auswählen, wird eine Browser-URL geöffnet. Kopieren Sie in Docker- oder Headless-Setups die vollständige Weiterleitungs-URL, auf der Sie landen, und fügen Sie sie wieder in den Assistenten ein, um die Authentifizierung abzuschließen.

    Basis-Image-Metadaten

    Das Haupt-Docker-Runtime-Image verwendet node:24-bookworm-slim und veröffentlicht OCI- Basis-Image-Anmerkungen einschließlich org.opencontainers.image.base.name, org.opencontainers.image.source und weiterer. Der Node-Basis-Digest wird über Dependabot-Docker-Basis-Image-PRs aktualisiert; Release-Builds führen keinen Distro-Upgrade-Layer aus. Siehe OCI-Image-Anmerkungen.

    Ausführung auf einem VPS?

    Siehe Hetzner (Docker-VPS) und Docker-VM-Runtime für Bereitstellungsschritte auf gemeinsam genutzten VMs einschließlich Einbacken von Binärdateien, Persistenz und Updates.

    Agent-Sandbox

    Wenn agents.defaults.sandbox mit dem Docker-Backend aktiviert ist, führt das Gateway die Ausführung von Agent-Tools (Shell, Lesen/Schreiben von Dateien usw.) innerhalb isolierter Docker- Container aus, während das Gateway selbst auf dem Host bleibt. Dadurch erhalten Sie eine feste Trennung um nicht vertrauenswürdige oder mandantenfähige Agent-Sitzungen, ohne das gesamte Gateway zu containerisieren.

    Der Sandbox-Geltungsbereich kann pro Agent (Standard), pro Sitzung oder gemeinsam sein. Jeder Geltungsbereich erhält einen eigenen Workspace, der unter /workspace eingebunden wird. Sie können außerdem Tool-Richtlinien für Zulassen/Verweigern, Netzwerkisolierung, Ressourcenlimits und Browser- Container konfigurieren.

    Vollständige Konfiguration, Images, Sicherheitshinweise und Multi-Agent-Profile finden Sie unter:

    Schnell aktivieren

    {
      agents: {
        defaults: {
          sandbox: {
            mode: "non-main", // off | non-main | all
            scope: "agent", // session | agent | shared
          },
        },
      },
    }
    

    Erstellen Sie das Standard-Sandbox-Image (aus einem Source-Checkout):

    scripts/sandbox-setup.sh
    

    Für npm-Installationen ohne Source-Checkout siehe Sandboxing § Images und Einrichtung für Inline-docker build-Befehle.

    Fehlerbehebung

    Image fehlt oder Sandbox-Container startet nicht

    Erstellen Sie das Sandbox-Image mit scripts/sandbox-setup.sh (Source-Checkout) oder dem Inline-Befehl docker build aus Sandboxing § Images und Einrichtung (npm-Installation), oder setzen Sie agents.defaults.sandbox.docker.image auf Ihr benutzerdefiniertes Image. Container werden bei Bedarf automatisch pro Sitzung erstellt.

    Berechtigungsfehler in der Sandbox

    Setzen Sie docker.user auf eine UID:GID, die zum Besitz Ihres eingebundenen Workspaces passt, oder ändern Sie den Besitzer des Workspace-Ordners.

    Benutzerdefinierte Tools in der Sandbox nicht gefunden

    OpenClaw führt Befehle mit sh -lc (Login-Shell) aus, was /etc/profile lädt und PATH möglicherweise zurücksetzt. Setzen Sie docker.env.PATH, um Ihre benutzerdefinierten Tool-Pfade voranzustellen, oder fügen Sie in Ihrem Dockerfile ein Skript unter /etc/profile.d/ hinzu.

    Während des Image-Builds wegen OOM beendet (Exit 137)

    Die VM benötigt mindestens 2 GB RAM. Verwenden Sie eine größere Maschinenklasse und versuchen Sie es erneut.

    Nicht autorisiert oder Pairing in der Control UI erforderlich

    Rufen Sie einen frischen Dashboard-Link ab und genehmigen Sie das Browsergerät:

    docker compose run --rm openclaw-cli dashboard --no-open
    docker compose run --rm openclaw-cli devices list
    docker compose run --rm openclaw-cli devices approve <requestId>
    

    Weitere Details: Dashboard, Geräte.

    Gateway-Ziel zeigt ws://172.x.x.x oder Pairing-Fehler von der Docker-CLI

    Setzen Sie Gateway-Modus und Bindung zurück:

    docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'
    docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789
    

    Verwandte Themen