你已經能用 Docker / Compose 跑 OpenClaw Gateway,但一開啟 Agent 沙箱就出現:容器起不來、工作區只讀/不可寫、沙箱裡明明缺命令、一構建就 OOM 退出 137。本文把 2026 年主流落地路徑壓成可執行順序:關→開→驗→排障,用配置鍵位、卷許可權與 `docker.user` 對齊、映象構建與 OOM 分診表和站內已有「Docker 安裝/卷許可權/doctor」類文章明確分工。讀完你應能判斷:是映象問題、掛載 UID 問題、還是資源上限與日誌關鍵字問題。
根因往往不在「OpenClaw 裝壞了」,而在程序邊界:
brew install 的東西不會自動出現在沙箱的 PATH,除非進映象或額外掛載/層。501:20、容器裡程序是 1000:1000 跑,常出現只讀失敗或寫拒絕,日誌裡以 Permission denied 或 EROFS 呈現。| 模式 | 適合什麼 | 你付出的成本 | 常見誤判 |
|---|---|---|---|
| Docker 沙箱 | 要對不可信命令/指令碼做硬隔離,復現「乾淨環境」 | 映象體積、拉取/構建、UID/GID/卷要對齊 | 以為宿主機工具自動繼承 |
| SSH / 遠端 shell | 在你信任的遠端 Mac上直接跑(例如獨佔構建機),需要完整工具鏈 | 暴露面與賬戶模型變大 | 把本機當沙箱、忘記審計 |
| 無沙箱 / 全本地 | 內網、低危、可快速排障 | 任一程式碼被模型執行時風險高 | 在 CI/生產也長期關閉 |
概念上分兩層:用哪個沙箱實現(Docker 映象/執行時)和映象從哪來。官方倉庫通常提供 scripts/sandbox-setup.sh(名稱以你本地克隆版本為準)來預構建/拉取作為宿主機上 docker CLI 能識別的映象。配置裡 agents.defaults.sandbox.docker.image 指向要執行會話的那個映象;兩者不一致時,典型症狀是「Gateway 認為沙箱已啟用,但 docker run 報 manifest not found 或 pull access denied」。
和已有文章怎麼分工? 若你卡在 OPENCLAW_IMAGE 或 Control UI 入口,先按 官方 Docker 一鍵與 GHCR 映象;若你卡在資料卷、許可權、持久化與 Skills 路徑,對照 Docker 卷與許可權檢查表。本篇只盯 沙箱子系統 + OOM/137。
OPENCLAW_HOME 掛載:按症狀對齊,而不是亂 `chmod 777`推薦順序:
docker.user 為 與卷可寫性一致的 UID:GID(以文件鍵名為準,若你版本用巢狀表結構則對應到 sandbox.docker 下);chown,優先調整掛載到容器內的子目錄,而不是放開整個磁碟。對 Linux 與遠端 Mac 的細微差別是:命名卷、繫結掛載、SELinux 標籤(在部分發行版上)會放大「在 compose 裡看著對、進容器就錯」的現象。此時要在 Gateway/沙箱容器的啟動日誌中抓首條 I/O 錯誤行,而不是在模型對話裡試運氣。
PATH 的目錄**中?docker exec 到沙箱裡跑 command -v 比口述可靠。~/.cache 之類路徑才能跑?若是,要評估把快取放進映象/公共層,而不是從宿主隨意穿越。HTTP(S)_PROXY?網路失敗常被誤報成 command not found。exit 137:在 Docker 裡如何讀「被殺」與「不夠記憶體」137 = 128 + 9 (SIGKILL) 在實踐裡常和 OOM killer 相關,但你也可能看到 人為 docker kill 或 cgroup 記憶體限制 觸頂。分診上至少做三件事:看 構建階段是 docker build 還是 docker run;在引擎側看 concurrent build 是否讓 Docker Desktop / VM 記憶體打滿;對遠端 Mac/專用機則看系統真實可用記憶體與 swap 壓力,而不是隻盯單容器 limits。另有一類易混訊號是退出碼 1 或 2卻伴隨大量 Cannot allocate memory 文本,也要併入「記憶體/磁碟臨時空間」同一張表,避免在模型側反覆調參卻不動容器。
對「構建時 OOM」的通用減負順序:關並行層(--parallel 等)、用多階段構建減少編譯峰、提高 Docker VM 分配、換帶更多記憶體的 獨佔遠端 Mac 檔位 作為穩定基座。這與「在筆記本上開多個 IDE + 本地大模型 + Docker」的偶然成功不是一類事件。若團隊已上共享儲存,額外關注inode 與後設資料小檔案爆發導致的「像 OOM 一樣卡死」現象,必要時分卷或改清理策略。
sandbox-setup 構建或拉取映象,記錄**映象名與 ID** 與配置一致。docker.user 與掛載做 A/B:只改一個變數、保留 diff,避免同時改三處後無法回滾。{
"agents": {
"defaults": {
"sandbox": { "mode": "docker" },
"docker": { "user": "1000:1000" }
}
}
}
// 實際專案可能為巢狀在 sandbox.docker 下,請先 openclaw doctor / 對照官方文件
docker events 或引擎日誌、宿主機 memory pressure,避免把業務 OOM 與 docker build 並行 OOM 混為同一類事故。chown -R 1000:1000 單個專案目錄 與「動整個家目錄」風險不同,變更要有工單與回滾點。pip 索引、以及無持久層時的重複下載,會把「能跑通一次」和「能跑通一百次」的成本拉開,應在容量評審裡給首啟時間一個數字。這類替代拓撲通常輸在記憶體與 I/O 的同時峰值與可重複的環境邊界上:你昨天能構建,是僥倖沒有併發;而生產 Agent 在高峰會穩定觸發 137 與寫放大。對需要7×24 Gateway + 沙箱的團隊,更可控的組合是 獨佔的 Apple Silicon 雲主機、清晰磁碟與日誌策略、可預期的租期。在這種前提下,MACCOME 的遠端 Mac 雲算力更適合作為 OpenClaw 的常駐基座——你減少的是與隨機本地環境搏鬥的時間,把精力放回工具鏈與產品交付。
常見問題
沙箱裡找不到宿主機已安裝的命令怎麼辦?
把**工具安裝進沙箱映象**或調整映象層;或按策略掛載額外目錄並更新 PATH。這與 MCP/Skills 校驗裡「工具在 Gateway 層可見性」的排法類似,但發生在容器邊界內。
看到 exit 137 就一定是 OOM 嗎?
不必然。要區分 cgroup 限流、系統 OOM、與人為 kill;至少抓一段同一時刻的引擎與系統記憶體曲線再下結論。日常入口也可先看 官方 doctor/無回覆分診 的日誌讀法。
開沙箱和買更大記憶體的 Mac 雲主機,哪個先?
先證明是隔離需求還是資源不足:用最小復現壓一次。若 137 在提高 Docker 分配或更大記憶體後消失,是資源;若你始終要跑不可信程式碼,是沙箱+治理。價目可對照 Mac 雲主機租賃 的公開檔。