OpenClaw Docker auf Mac-Cloud 2026: Exit 137/OOM, uid-1000-Volumenrechte, DNS und der kürzeste Pfad mit openclaw doctor
Betreiber, die OpenClaw in Docker auf Mac-Cloud-Knoten betreiben, sehen häufig Exit 137, „Permission denied“ auf gemounteten Konfigurationspfaden oder HTTPS, das auf dem Host funktioniert, im Container aber scheitert – und verbringen dann Tage mit Neuinstallationen von Images. Dieser Artikel sagt, für wen er gedacht ist (SREs und Einzelentwickler auf gemieteten Macs), was Sie gewinnen (eine geordnete Checkliste und Symptommatrix im Einklang mit offizieller Compose-Praxis 2026) und wie er aufgebaut ist: zuerst Speicher und cgroups, zweitens uid-1000-Volumes, drittens Docker-DNS, danach openclaw doctor, Port 18789 und wann Sie Container zugunsten von nativem macOS aufgeben sollten.
In diesem Artikel
1. Bereitschafts-Triade: Prozess läuft, Port gemappt, Volume beschreibbar
Offizielle Docker- und Docker-Compose-Abläufe kapseln das OpenClaw-Gateway in einem Container. Der Mac-Cloud-Host behält Kontrolle über RAM und CPU-Kontingente, bind-mountet ~/.openclaw (oder ein benutzerdefiniertes Konfigurationsverzeichnis) und veröffentlicht 18789 oder einen anderen gemappten Port für Loopback-Checks oder SSH-Tunnel. Anders als ein Laptop auf dem Schreibtisch kommen Cloud-Macs oft mit begrenztem Speicher, häufig ohne GUI-Session und mit Images, die typischerweise als Nicht-root-Benutzer node mit uid/gid 1000 laufen. Solange diese Fakten nicht verinnerlicht sind, passieren die meisten Konfigurationsänderungen auf der falschen Schicht.
Definieren Sie Bereitschaft als drei Beobachtungen, die Sie in ein Ticket kopieren können: Der Container ist running oder healthy, docker compose ps zeigt die erwartete ports-Zuordnung, und Befehle wie openclaw status oder Ihre Health-Probe sind im Container ohne Berechtigungsfehler erfolgreich. Modell-Routing, Slack-Webhooks und Cron gehören erst danach. Typische Compose-Fehler sind Host-Pfade, die nicht existieren (Docker legt dann root-eigene Verzeichnisse an), read-only-Mounts, obwohl das Gateway Zustand persistieren muss, oder ein kleines Root-Volume, das mit Image-Layern und Build-Cache volläuft – Symptome, die wie zufällige Abstürze wirken, bis df -h die Wahrheit zeigt.
Notieren Sie Compose-Projektname, Servicenamen, veröffentlichte Ports und absolute Host-Pfade für Konfiguration und Workspace. Diese eine Zeile im Runbook spart Stunden, wenn Sie Upgrade-Guides, Webhook-Posts oder stilles Cron-Troubleshooting gegeneinander abgleichen: Alle sehen dieselbe Topologie statt zu raten, welche Maschine gemeint war.
2. Schmerzpunkte (nummeriert)
- Exit 137 und OOM: Docker mappt Linux-cgroup-Speicherlimits auf die Workload. Wenn der Kernel-OOM-Killer zuschlägt, meldet Docker oft Exit-Code 137 (128 + SIGKILL 9). Images ziehen oder bauen ist RAM-intensiver als stabiler Gateway-Traffic; ein Knoten, der „stundenlang läuft“, kann in Minuten bei
docker compose buildsterben. Erfassen Sie immer, ob 137 in der Build- oder Laufphase auftrat – die Behandlung unterscheidet sich. - Volumenbesitz versus uid 1000: Legen Sie
~/.openclawauf dem Host als root oder als persönlichen Benutzer an, kann dernode-Prozess im Containeropenclaw.json, Logs oder Workspace-Dateien nicht schreiben. Der Fehler kann als stiller Start-Loop erscheinen, nicht als klarer Stacktrace, und wird oft fälschlich „schlechten Release Notes“ zugeschrieben. - Docker-DNS und Firmen-Egress: Wenn
curl https://api.anthropic.comauf dem Host klappt,docker exec … curlaber scheitert, fehlen dem Container fast immer korrekte DNS-Server, HTTP(S)_PROXY-Variablen oder Sicht auf den Trust Store hinter einem TLS-interceptierenden Proxy. API-Schlüssel zu rotieren, bevor der Netzwerkpfad stimmt, verschwendet Zeit und Kontingent. - Health-Checks und Abhängigkeitsrennen: Aggressives
depends_onohne großzügigestart_periodflutet Logs mit „connection refused“, die wie Anwendungsfehler aussehen. Zeigen Sie, dass das Gateway lauscht, bevor nachgelagerte Dienste es bombardieren.
Zusammen erklären diese vier Muster den Großteil produktionsnaher Vorfälle, die wir bei Mac-Cloud-Mandanten sehen; die folgende Matrix verdichtet sie zu ersten Maßnahmen.
3. Symptom-zu-Ursachen-Matrix
Nutzen Sie die Tabelle als Entscheidungsblatt im Incident: Wählen Sie das nächstliegende Symptom und führen Sie die Spalte „Erste Maßnahmen“ aus, bevor Sie sekundäre Hypothesen verfolgen.
| Beobachtbares Signal | Wahrscheinliche Ursache | Erste Maßnahmen (geordnet) |
|---|---|---|
Neustart-Schleife, OOMKilled, Exit 137 | cgroup- oder Host-Speicherdruck | Speicher für Docker Desktop/Engine oder Compose-mem_limit erhöhen; konkurrierende RAM-lastige Jobs stoppen; Build mit weniger parallelen Layern wiederholen |
Permission denied auf Konfigurations- oder Workspace-Pfaden | Bind-Mount mit falscher uid | Auf dem Host: sudo chown -R 1000:1000 /pfad/zum/mount; RW in Compose prüfen; mit docker exec -u node … touch Testdatei verifizieren |
| HTTPS- oder DNS-Fehler nur im Container | Resolver im Container oder fehlender Proxy | docker exec, cat /etc/resolv.conf, curl -v; dns: in Compose oder daemon.json ergänzen; --env-file für Firmenproxies |
| Prozess läuft, Port von außen nicht erreichbar | Port-Mapping, Bind-Adresse oder Cloud-Security-Group | ports: mit beabsichtigtem 0.0.0.0 vs. 127.0.0.1 abgleichen; SG-Regel öffnen; SSH-Tunnel gemäß Härtungsleitfäden bevorzugen |
openclaw doctor meldet fehlende Credentials, obwohl Compose sie „setzt“ | Umgebung erreicht den Container-Prozess nicht | docker exec … env | grep OPENCLAW gegen Compose-environment; Quoting und Vererbung korrigieren |
4. Sechs geordnete Behebungsschritte (nicht leichtfertig umsortieren)
Die Reihenfolge zählt, weil spätere Schritte voraussetzen, dass frühere ganze Fehlerklassen ausgeschlossen haben. Direkt zu Image-Retags zu springen zerstört Beweise.
- Zustand erfassen:
docker compose ps -aausführen, danndocker logs <service> --tail 200. Festhalten, ob Exit 137 beim Image-Pull, Build oder im stabilen Betrieb auftrat. - Speicher-Headroom prüfen: Weisen Sie Docker für Builds vorübergehend grob 4–8 GB zu (an Provider-Dokumentation anpassen). Auf dem Host
memory_pressureoder Activity-Monitor-Äquivalente prüfen; starker Swap plus Gateway-Last ist ein Rezept für flaky SIGKILL. - Volumenbesitz vereinheitlichen:
chownauf jeden Bind-Pfad anwenden, in den der Container schreibt. Vor erneutem OpenClaw-Test einen trivialen Schreibtest als uid 1000 im Container wiederholen. - Container-Netzwerk beweisen: Von innen den LLM-Provider mit
curl -sIoder bei TLS-Zweifelnopenssl s_clientansprechen. Bei firmeninternem MITM dieselben Trust-Materialien oder Proxy-Variablen spiegeln wie auf dem Host. - Diagnose-CLI ausführen:
openclaw doctor,openclaw statusundopenclaw models status(Namen je nach aktueller CLI) ausführen. Nur wenn doctor nach allem Obigen weiterhin rot mit Installationsfehlern meldet, Images neu installieren oder Tags wechseln. - Abnahme auf Port 18789:
curl -sI http://127.0.0.1:18789(oder gemappter Port) vom Host; für Remote-Admins SSH-Tunnel oder Reverse-Proxy-Pfade gemäß Security-Artikeln prüfen.
docker system prune -a während eines laufenden Incidents – es löscht Layer-Cache und Log-Kontext und verlängert die mittlere Reparaturzeit.5. Zitierfähige technische Fakten (mindestens drei, wir listen sieben)
- Semantik von Exit 137: In Docker zuerst als OOM behandeln; mit
docker inspect … OOMKilledbestätigen, sofern verfügbar. - uid-1000-Vertrag: Offizielle Node-Images erwarten beschreibbare Mounts für uid 1000; eine Diskrepanz ist kein Produktdefekt.
- RAM-Untergrenze (Erfahrungswert): Community und Docs nennen grob 2 GB als fragile Mindestgröße für Image-Arbeit; Builds brauchen oft ein Mehrfaches an Headroom.
- Port 18789: Standard-Gateway/UI-Mapping in vielen Beispielen; öffentliche Freigabe ohne Token-Härtung widerspricht Produktionsleitlinien aus VPSMAC-Härtungsartikeln.
- Sichtbarkeit der Umgebung: Compose-Variablen sind keine Magie – für
doctorzählt nur, was der Container-PID erbt. - Doppelte Stacks: Zwei Compose-Projekte, die denselben Host-Port binden oder ein Konfigurationsverzeichnis teilen, erzeugen intermittierendes „funktioniert einmal“-Verhalten; mit
docker psund Mount-Inspect prüfen. - Baseline-Artefakte: Vor Upgrades letzte stabile
docker inspect-JSON-Snippets und ein grünes doctor-Transkript aufbewahren, um Regressionen von Drift zu unterscheiden.
6. Schluss: Docker-Komfort versus natives macOS auf VPSMAC
Docker glänzt bei reproduzierbaren Demos und Mandanten-Isolation, aber jeder Namespace und jedes cgroup ist ein weiterer Hop, wenn nachts der Pager klingelt. Sie zahlen mit doppelter DNS-Konfiguration, uid-Gymnastik auf Volumes und erschwerter Korrelation zwischen Host-Swap-Druck und Container-Todesspiralen. Wenn Teams Images iterieren statt Mounts zu reparieren, entstehen „Schneeflocken“-Compose-Dateien, die niemand mehr anfassen will – kaum das Ergebnis, das Sie für ein 7×24-Agent-Gateway wünschen.
Native Installation auf einem Bare-Metal-Mac-Cloud-Knoten – per SSH einloggen, offiziellen Nicht-Container-Pfad ausführen, mit launchd überwachen – kollabiert mehrere Fehlerdomänen: Dieselbe uid wie in ssh schreibt die Konfiguration, Resolver-Einstellungen entsprechen Ihrer Shell, und openclaw doctor liest das Dateisystem, dem Sie ohnehin vertrauen. Für OpenClaw-Workloads, die sich wie Produktionsdienste statt wie Wegwerf-Labs verhalten, schlägt diese Reduktion beweglicher Teile meist das Quetschen in ein weiteres Custom-Image. Rein-Docker-Stacks erhöhen außerdem laufenden Troubleshooting-Aufwand und Leistungsschwankungen unter Dauerlast; dedizierte physische Mac-Hosts dämpfen beides.
Ein VPSMAC-Mac zu mieten ist daher der pragmatische nächste Schritt, sobald die Bereitschafts-Triade sich nicht stabilisieren lässt: Sie behalten Apple-Silicon-Kompatibilität und 24/7-Stromversorgung, ohne zusätzlich Container-Ergonomik gegen Cloud-Kontingente zu kämpfen. Kombinieren Sie den Knoten mit dem Five-Minute-Deploy-Artikel fürs Bootstrap und der Produktions-Härtungs-Checkliste für Exposition – dieselbe Toolchain, weniger Abstraktionssteuer. Das ist der Trade, den dieser Artikel empfiehlt, nachdem Sie die Matrix oben ehrlich ausgeschöpft haben: nicht als Slogan, sondern weil wiederholte 137- und Berechtigungsschleifen auf Schichtanzahl und nicht auf Modellqualität hindeuten.