2026 OpenClaw Docker 持久化卷與權限實操
配置不丟、Skills 可寫與重啟後狀態對照清單

約 21 分鐘閱讀 · MACCOME

用 Docker / Compose 跑 OpenClaw Gateway的團隊裡,最耗時的往往不是「鏡像能不能拉下來」,而是重啟、升級或 docker compose down 之後配對與配置像被「一鍵清零」,或 Skills 目錄在容器裡只讀、日誌報 Permission denied,卻與官方 Troubleshooting 裡的網路條目對不上。本文與《Docker 網路分診》《裝後 doctor 排錯》《Docker 生產與 Gateway 常駐》《遠端 Mac 常駐運維》分工:給出六類卷/權限側誤區、兩張「該掛哪裡 vs 反模式」表、症狀→命令→修復矩陣、可複製檢查片段、六步 Runbook、三條面板口徑;排障順序上堅持先卷與 UID/GID,再網路與反代

先把「重啟就丟」從玄學拆成六類可寫進 RCA 的卷/權限根因

容器鏡像本身是只讀模板;會丟的只有寫進可寫層、匿名卷或未持久化路徑裡的狀態。下列信號建議寫進變更單,並與 Compose 文件版本號、鏡像 tag 同一行評審。

  1. 匿名卷或未命名掛載:Compose 只聲明了服務內路徑,沒有綁定宿主機目錄;down -v 或清理腳本會連帶刪掉配對與緩存,表現為「我明明沒改配置」。
  2. 綁定路徑在遠端 Mac 上漂移:用戶主目錄、同步盤或臨時掛載點變化,導致 bind 指向空目錄或舊快照,Gateway 啟動成功但讀到空白配置。
  3. UID/GID 不匹配:容器進程用戶與宿主機目錄所有者不一致,Skills 熱更新或日誌寫入失敗;圖形化 Docker Desktop 與 Linux 宿主行為不同,複製 Compose 片段時最容易踩坑。
  4. 只讀掛載誤用:為「安全」把配置或 Skills 標成 :ro,官方示例若需要寫入 token 緩存或本地狀態則會靜默失敗或退回到內存態,重啟後消失。
  5. 把狀態寫進容器可寫層:未掛卷時 docker commit 看似能救場,但升級鏡像或換 tag 後仍丟;不適合作為生產策略。
  6. 多實例共享同一目錄無鎖:試驗性並行起兩個 Compose 項目寫同一 bind,導致配置文件損壞或半寫入,日誌像隨機 JSON 截斷。

若你已對照《網路分診》仍遇到「CLI 偶發連上、重啟必掛」,優先回到本篇核對命名卷是否真落在預期盤、進程用戶能否寫 Skills,再決定是否調整 network_mode 或反代。

表 1:OpenClaw 在 Docker 裡「應該持久化哪裡」與常見反模式

具體子路徑以你當前鏡像與文檔為準;下表給的是工程上應問的三類問題:是否跨容器生命周期、是否要備份、是否多人只讀。把結論寫進 README 與 on-call 手冊。

類別典型應持久化內容推薦做法反模式
配置與密鑰材料Gateway 地址、provider 選擇、通道 token 路徑等宿主機 bind 或命名卷;權限收緊到運行用戶寫進鏡像層;或放在會被同步軟體「清理」的臨時目錄
運行態與配對設備配對、會話恢復所需狀態單獨子目錄 bind,升級前 tar 備份依賴匿名卷且未在 Compose 文檔化;prune 一鍵消失
Skills / 擴展團隊維護的 skill 文件、腳本bind 到倉庫旁固定路徑;CI 與生產同一路徑約定:ro 卻需要運行時生成緩存;或 UID 不可寫
日誌與緩衝大體積日誌、臨時導出獨立卷或宿主路徑,配合輪轉寫滿容器可寫層觸發 OOM 或意外只讀文件系統

表 2:症狀 → 建議檢查命令 → 修復動作(先卷後網路)

執行下列檢查時,保持同一終端會話記錄下鏡像 ID、Compose 項目名與卷名,便於升級回滾;與《生產 Runbook》裡的發布檢查表共用一頁。

症狀優先檢查常見修復仍失敗時
docker compose up 後一切「像全新安裝」docker inspect 看 Mounts 是否指向預期宿主路徑;是否用了 -v 清理過卷改為顯式 bind 或命名卷;文檔化 down 是否允許帶 -v核對是否連錯 Compose 項目目錄
Skills 不生效 / 寫入失敗容器內 id 與宿主 ls -ln 所有者調整 userchmod 或在 Dockerfile/entrypoint 對齊 UID檢查是否 :ro 掛載
Permission denied 刷屏SELinux/AppArmor(Linux)或 Docker Desktop 文件共享列表(macOS)Linux:標籤或 :z 類策略按安全基線評估;macOS:把路徑加入 File Sharing回到《網路分診》前確認不是偽裝的磁碟只讀
升級鏡像後「半可用」配置 schema 是否變更;舊數據目錄是否仍掛載按發行說明做遷移;先備份再升級openclaw doctor 對照官方 Breaking changes
bash
# 1) 掛載是否落在你以為的宿主路徑(替換容器名)
docker inspect -f '{{ json .Mounts }}' <container> | jq .

# 2) 容器內運行用戶(與宿主目錄所有者對照)
docker exec -it <container> id

# 3) Compose 實際使用的項目卷(避免匿名卷漂移)
docker compose ls
docker volume ls | grep <project>

# 4) 升級前備份 bind 目錄示例(路徑按團隊約定)
tar czf openclaw-state-$(date +%Y%m%d).tgz ./openclaw-data/
info

提示:在遠端 Mac 上若使用 Docker Desktop,宿主路徑常位於用戶目錄下;若使用 Linux 雲機,同一 Compose 片段可能需要不同的 user 與權限策略——不要把「筆記本上能跑」直接等價於「池化機器上能跑」。

六步 Runbook:從「能起容器」到「重啟/升級也不丟狀態」

  1. 畫出數據平面:在架構圖標註配置、運行態、Skills、日誌四類目錄各自 bind 點;與《生產 Runbook》中的服務框圖合併。
  2. 禁止隱式匿名卷:所有需要跨重啟保留的路徑在 Compose 中顯式命名;在 README 寫明「執行 down -v 會刪除什麼」。
  3. 固定 UID/GID 策略:選容器內運行用戶,並在宿主創建同權或 ACL;多機池化時寫入 Ansible/雲初始化腳本。
  4. 升級前凍結備份:對 bind 目錄做時間戳歸檔;記錄舊鏡像 digest 與 Compose 版本。
  5. 先跑卷體檢再跑 doctor:確認 Mounts 與權限無誤後,再執行 openclaw doctor 與通道探活,避免假陰性。
  6. 把檢查寫進值班手冊:on-call 第一步打開本文表 2 與網路篇表 1,減少「同時改網路和卷」的並行混亂。

三條應寫進面板與復盤材料的「硬核」口徑

  1. 卷掛載合規率:統計「應持久化路徑中,顯式 bind/命名卷覆蓋率」;低於 100% 的 staging 環境不得標 production-ready。
  2. 權限失敗佔比:從容器日誌過濾 Permission deniedEACCES;若與 Gateway 版本升級同向飆升,優先懷疑掛載模式而非 provider。
  3. 狀態備份頻率:記錄每次升級前是否產生歸檔;2026 年常見事故是「升級成功但無人記得 bind 路徑在另一臺機」。把備份存在與 Gateway 不同盤或對象存儲,滿足 RPO 口頭合同。

上述指標與《遠端 Mac 常駐運維》中的磁碟與日誌口徑並列:卷問題會表現為磁碟暴漲或只讀;不要未看磁碟水位就先擴 CPU。

補充一條可執行觀察:在 2025–2026 周期,許多團隊把 Gateway 與 Skills 放在同一宿主目錄樹下;若未對「僅日誌可增長」的子目錄單獨配額,會出現日誌把整塊 bind 撐滿後,配置寫入也一併失敗的連鎖症狀。此時應先按常駐篇做日誌輪轉或拆卷,而不是反覆重建容器。

另一條常見誤判是把 docker compose restartdown/up 混用:前者通常保留同名容器與已聲明卷;後者若帶上清理參數會改變數據命運——值班手冊裡應用同一動詞表,避免口頭說「重啟」實際執行了帶卷刪除的流水線。

為什麼「僅靠本機 Docker 試驗」難撐長期無人值守 Gateway

筆記本上的單用戶目錄權限與遠端池化機器的多租戶/自動化登錄不同;睡眠、磁碟同步與手改 bind 路徑會讓「昨天能跑」無法複製。要把 OpenClaw 當作 24/7 控制面,需要路徑合同化、鏡像升級可回滾、權限可審計

在自家機器上反覆試錯適合學習,但生產上更常見成本是值班時間與通道不可用。碎片化的臨時容器缺少穩定掛載與宿主權限模型時,升級與擴容反而增加故障面。對需要長期在線、可備份、可遷移的 Gateway 而言,把宿主環境落在具備 Apple Silicon 物理節點與多地區選擇的 Mac 雲平臺上,通常比反覆在個人設備上改 Docker 更利於形成標準 Runbook。MACCOME 提供多地 Mac Mini M4 / M4 Pro 租賃與公開幫助文檔,適合作為 OpenClaw 與自動化工作流的執行平面;先查幫助與價格,再按區域頁落單。

落地建議:先在目標宿主(與生產同類型:Docker Desktop 或 Linux)跑通表 2 全量檢查,再接入通道與模型;避免「本地 Mac 試通就上雲」導致 UID 與路徑雙重漂移。

若團隊同時使用 Kubernetes,請記住 Pod 重建比 Compose 更頻繁:無狀態容器假設下,任何未入 PVC 的目錄都會在滾動發布中丟失;這與本文強調的「顯式持久化」原則一致,只是檢查入口換成 kubectl describe pvc 與掛載清單。

常見問題

這篇和「Docker 網路分診」怎麼分工?

網路篇處理連接與命名空間;本篇處理數據是否落盤與是否可寫。若需對照安裝入口,見《三平臺安裝指南》。接入與價格可在 幫助中心租賃價格說明查看。

應該先跑 doctor 還是先查卷?

先確認卷與權限,再跑 doctor,避免「每次重建都是新容器」導致的假陽性;WSL2 特有問題仍回到《裝後 doctor 排錯》篇。

和「遠端 Mac 常駐運維」如何配合?

常駐篇講 launchd/systemd、日誌與假死;本篇講 Docker 數據是否持久與是否可寫。兩篇應出現在同一變更評審與值班手冊目錄中。