2026 OpenClaw Docker 在 Mac 雲主機上的典型故障修復:Exit 137/OOM、卷許可權 uid 1000、DNS 與 openclaw doctor 最短排障路徑(可復現)
在 Mac 雲主機上用 Docker 跑 OpenClaw 時,容器突然退出 137、配置目錄 Permission denied、或閘道器已起但模型/API 永遠連不上,往往被誤判為「版本壞了」而反覆重灌。本文面向 2026 年官方映象與 Compose 實踐,先給現象—根因—首查動作對照表,再按記憶體、卷許可權、DNS、openclaw doctor 與日誌跟讀的最短路徑排查,並附 5 步驗收清單與 FAQ 結構化資料。
1. 部署形態與埠 18789:先驗收「程序在、埠在、卷可讀」
官方文件推薦的 Docker / Docker Compose 路徑把閘道器與執行時封裝在容器內,宿主機主要承擔三件事:分配足夠記憶體與 CPU、把 ~/.openclaw(或你指定的配置目錄)以卷掛進容器、以及放行 18789(或你在 compose 中對映的宿主機埠)供本地迴環或經 SSH 隧道訪問。Mac 雲主機與筆記本的差異在於:雲側常無桌面互動、磁碟與記憶體由套餐封頂、且部分映象預設以非 root 使用者 node(常見 uid/gid 1000)執行。若跳過「就緒」定義直接改配置,容易在錯誤層級上打轉。建議把就緒定義為可觀測的三元組:容器處於 running 或 healthy、docker compose ps 中埠對映與預期一致、在容器內執行 openclaw status 或健康檢查命令無許可權錯誤。只有三者同時成立,才進入模型連通與通道配置;否則優先處理資源、卷與網路解析。
Compose 檔案裡常見兩類失誤:一是把宿主機路徑寫成容器內不存在的父目錄導致建立失敗;二是把只讀標誌誤留在需要回寫配置的捲上。雲主機若使用非預設 Docker 資料根目錄或根分割槽較小,還要額外關注映象層與 build cache 佔滿根盤引發的「啟動成功隨即崩潰」。因此建議在 Mac 雲上為 Docker 資料與 OpenClaw 工作區分卷或使用大容量資料盤掛載點,並在排障筆記裡固定記錄「compose 專案名、容器名、宿主機埠、配置目錄絕對路徑」,以便與站內其他 OpenClaw 文(升級、Webhook、靜默 Cron)交叉對照時不必重新猜環境。
2. 三類高頻痛點:為什麼 Docker 版 OpenClaw 在雲上更容易「看似隨機」失敗
- Exit 137 與隱性 OOM:137 常表示程序被 SIGKILL,Docker 場景下最常見原因是 cgroup 記憶體上限或 Docker Desktop/Engine 全域性記憶體頂到後殺程序。Mac 雲若同時跑構建、代理與其他常駐服務,留給容器的可用 RAM 可能比預期少;映象構建階段比純執行階段更吃記憶體。
- 卷許可權與 uid 1000:配置與 workspace 目錄若在宿主機上以 root 或其他 uid 建立,容器內
node使用者無法寫入openclaw.json、日誌或 workspace,會在啟動早期失敗或表現為「配置不生效」。這與升級、通道無關,卻被誤當成版本 bug。 - DNS 與企業出口:容器內解析失敗或 TLS 握手被中間裝置攔截時,症狀是「閘道器程序在但模型永遠超時」;若只在宿主機上
curl成功、容器內失敗,根因幾乎總在 Docker 網路/DNS 或代理未傳入容器,而非 API Key 本身。 - 時序與健康檢查競態:compose 若在未就緒時就把依賴方拉起,會在日誌裡留下大量「連線被拒絕」噪聲;適當拉長
start_period或先手工跑通一次再啟用depends_on的嚴格順序,可避免誤判為配置錯誤。
3. 症狀—根因—首查動作對照表
| 現象 | 高機率根因 | 首查動作(按順序) |
|---|---|---|
容器反覆重啟,docker inspect 顯示 OOMKilled 或 exit 137 | 記憶體上限/宿主機記憶體不足 | 調高 Docker 資源或 compose mem_limit;先停併發布無關重記憶體程序再啟 |
| 日誌出現 Permission denied 寫配置或 workspace | 卷屬主非 uid 1000 或只讀掛載錯誤 | 宿主機 chown -R 1000:1000 目標目錄;確認 compose volume 讀寫 |
容器內 curl API 失敗,宿主機成功 | Docker DNS / 代理未進容器 | docker exec 內解析與 HTTPS 探測;必要時 daemon DNS 或 --dns |
| 埠不通但容器 running | 對映錯誤、防火牆/安全組、僅綁 127.0.0.1 | 核對 ports: 與雲安全組;SSH 隧道或反代文件 |
| 配置看似正確仍異常 | 環境變數未傳入容器 | 檢查 compose environment/env_file 與 docker exec openclaw env |
4. 可復現排障步驟(建議嚴格按序執行)
- 抓取退出態與最後日誌:
docker compose ps -a,docker logs <container> --tail 200;若見 137,同步記錄是否發生在 build 或 run 階段。 - 驗證資源邊界:為測試目的臨時提高 Docker 可用記憶體到至少約 4~8GB 區間再啟動(具體以映象文件為準);確認 Mac 雲套餐本身未在宿主機層 OOM。
- 校驗卷與屬主:在宿主機對掛載目錄執行(路徑按你實際為準):
sudo chown -R 1000:1000 ~/.openclaw與 workspace;再用docker exec -u node … ls -la確認可寫。 - 容器內網路探測:
docker exec <container> ping -c 2 1.1.1.1(若允許)、docker exec … curl -sI https://api.anthropic.com或與所用提供商等價的 HEAD;失敗則調整 Docker DNS 或注入企業代理環境變數。 - 最短軟體路徑:在容器或官方推薦入口執行
openclaw doctor、openclaw status、openclaw models status(以當前 CLI 為準),對照官方 FAQ 逐項消紅;僅當 doctor 持續報安裝層錯誤且日誌指向損壞映象時,再考慮拉取新 tag 或清理 volume 後重灌。 - 埠與隧道驗收:本機
curl -sI http://127.0.0.1:18789(或對映埠)應返回預期;若僅遠端訪問,按站內 SSH 隧道或零信任文配置轉發。
docker system prune -a;會拉長排障週期並可能清掉仍有價值的日誌與中間態。5. 可引用技術資訊(排障報告可直接貼上)
- Exit 137:在 Docker 語境下優先按 OOM 處理;應同時檢查宿主機剩餘記憶體與 compose 資源上限。
- uid 1000:多數 Node 系映象預設非 root 執行;宿主機目錄屬主與許可權必須與容器使用者一致或可寫組許可權。
- 記憶體經驗閾值:官方材料常給出映象構建或執行的 RAM 下限(常見討論閾值為 2GB 量級);低於下限時 build OOM 與執行期隨機 kill 機率顯著上升。
- 埠 18789:為閘道器/UI 常用對映埠;是否暴露到公網應結合 Token 與反代,參見站內生產加固與防火牆類文章。
- 診斷命令優先順序:
docker logs→ 資源與卷 → 容器內curl/doctor→ 再升級到重灌或換 tag。 - 環境變數可見性:在 compose 中改動的
OPENCLAW_*或提供商 Key 若未進入容器程序環境,doctor仍報未配置;用docker exec列印環境與配置檔案摘要可避免誤判。 - 併發與多例項:同一 Mac 雲節點若誤起兩套 compose 專案爭用同一宿主機埠或同一配置目錄,會表現為「偶發連上、偶發拒絕」;用
lsof或docker ps核對監聽與掛載可快速拆分。
6. 何時該停在一層抽象上:Docker 邊界與 Mac 雲原生
Docker 把依賴與執行時封進映象,換來可重複交付;代價是多一層網路名稱空間、卷對映與資源 cgroup,排障時要同時在「宿主機—引擎—容器—程序」四條鏈路上對齊訊號。對於需要長期 7×24、頻繁讀寫鑰匙串附近能力或與 macOS 圖形/自動化深度耦合的工作負載,純容器棧一旦遇到許可權、cgroup 或虛擬化疊床架屋,運維成本會明顯高於「在乾淨 macOS 上原生安裝並交給 launchd 守護」。若你的團隊已經在 Docker 層消耗大量時間仍無法穩定達到「就緒三元組」,值得評估把閘道器跑在原生環境或遷移到專門提供物理 Mac、SSH 直通的雲主機上,以減少抽象層帶來的不確定性。Docker 方案適合快速試驗與多例項隔離;但當目標是生產級穩定與更低排障面時,租賃 VPSMAC 這類原生 Mac 雲節點、按官方非容器路徑部署並配合站內 5 步上線與加固清單,往往是更省心的長期解。
從成本視角看,反覆重灌映象而不解決卷與 DNS,會把人力消耗在「不可積累的臨時修復」上;而把同一套檢查清單固化到 Runbook(含截圖或日誌模板),才能在第二次故障時分鐘級定位。無論你最終保留 Docker 還是切換到原生安裝,都建議保留一份「最後一次健康的 docker inspect 摘要」或 openclaw doctor 全綠輸出,作為升級與回滾的基線。這樣當 2026 年後續小版本迭代帶來行為差異時,可以迅速判斷是映象迴歸還是環境漂移,而不是從頭猜測。將本文對照表列印成一頁紙貼在值班手冊旁,往往比多裝一個監控外掛更能縮短 MTTR。