想完全避開 Docker volume 這一類設定會消失的問題?用 ZenClaw。 MixerBox AI 做的 OpenClaw 託管服務,9 秒就能開始用,狀態持久化由我們負責,你完全不需要碰 Docker volume。這篇文章給需要自架的人:5 秒判斷你中招沒有、三種正確的掛法、以及已經弄丟的設定怎麼救。
5 秒判斷你中招沒
跑一條 docker inspect 看 Mounts 是不是空陣列就知道。空的就是沒掛 volume,每次 restart 設定都在丟。 完整指令:
docker inspect openclaw | grep -A 5 Mounts
如果看到的是:
"Mounts": [],
——你中招了。你每次 docker restart 都在重置所有設定、WhatsApp session、對話記憶、Telegram token。
如果看到的是像這樣:
"Mounts": [
{
"Type": "volume",
"Source": "openclaw_data",
"Destination": "/root/.openclaw",
...
}
]
——你沒事,繼續用。
為什麼會這樣
因為 Docker container 的檔案系統預設是 ephemeral(短暫的)——容器一停就還原、連你寫的設定都丟光。 你在容器內寫任何檔案,都寫在一層疊在 image 上的 writable layer。容器一停,這層被丟掉;容器一刪,連這層都沒了。Docker 官方文件 Storage overview 有詳細解釋這個機制。
OpenClaw 把 runtime 狀態全部放在使用者家目錄下的 ~/.openclaw/(Docker 以 root 跑時就是容器內 /root/.openclaw/)。依照 OpenClaw 官方 config 文件 和 Simon Willison 的 TIL: Running OpenClaw in Docker,結構大致是:
~/.openclaw/
├── openclaw.json # 主設定(JSON5):模型、gateway、channel token、spend cap
├── sessions/ # 對話 session 紀錄
├── agents/ # 自訂 agent 定義
├── credentials/ # channel 認證(含 WhatsApp 的 whatsapp-creds.json)
└── skills/ # 你裝的 plugin / skill
這些檔案沒掛 volume 就是隨用隨丟。最敏感的是 credentials/whatsapp-creds.json(Baileys session):一旦掉,WhatsApp 強制你重掃 QR code,中間使用者傳的訊息全部漏接。這個坑社群回報過很多次,見 Issue #9096 — WhatsApp session not persisted across gateway restarts 和 官方 WhatsApp channel 文件。
常見三種錯誤寫法
三種最常見的錯法:完全沒掛 volume、掛錯目標路徑、或用 docker exec 進去改設定以為會存住。 第一次裝 OpenClaw 至少會中一個。
錯誤 1:完全沒掛
# 錯
docker run -d --name openclaw openclaw/openclaw:latest
錯誤 2:掛錯路徑
# 錯,OpenClaw 實際用 /root/.openclaw 不是 /app/data
docker run -d -v openclaw_data:/app/data openclaw/openclaw:latest
錯誤 3:docker exec 改完以為存住了
# 改完退出就沒了
docker exec -it openclaw vi /root/.openclaw/openclaw.json
三種正確掛法
三種都能持久化設定:production 選 named volume、開發選 bind mount、長期維運選 docker-compose。 下面各自怎麼寫。
方式一:named volume(建議 prod)
docker volume create openclaw_data
docker run -d \
--name openclaw \
-v openclaw_data:/root/.openclaw \
-p 18789:18789 \
openclaw/openclaw:latest
優點:Docker 管實際儲存位置,換主機 docker volume inspect 就能找到。細節參考 Docker volumes 官方文件。
缺點:備份要 docker run --rm -v openclaw_data:/data -v $(pwd):/backup alpine tar czf /backup/openclaw.tar.gz /data,步驟比較多。
方式二:bind mount(建議 dev)
mkdir -p ./openclaw_data
docker run -d \
--name openclaw \
-v $(pwd)/openclaw_data:/root/.openclaw \
-p 18789:18789 \
openclaw/openclaw:latest
優點:設定檔就在你當前目錄,VSCode 直接改、git add 直接版控(一定要把 credentials/ 加 .gitignore,裡面有 WhatsApp session 等敏感密鑰;openclaw.json 如果內嵌 bot token 也要一併 ignore)。
缺點:換主機要自己 rsync 過去。
方式三:docker-compose(長期維運)
寫 docker-compose.yml:
services:
openclaw:
image: openclaw/openclaw:latest
restart: unless-stopped
ports:
- "18789:18789"
volumes:
- ./data:/root/.openclaw
environment:
- OPENCLAW_LOG_LEVEL=info
然後 docker compose up -d。重點是 restart: unless-stopped——不然主機重開機 bot 不會自己起來,你客戶訊息又漏接。完整的 compose 語法參考 Docker Compose reference。
三種掛法對照
| 比較項目 | 方式一:named volume | 方式二:bind mount | 方式三:docker-compose |
|---|---|---|---|
| 適合誰 | Production、正式上線 | 開發 / 本機測試 | 長期維運、需要一次管好啟動參數 |
| 備份難度 | 較麻煩(要 alpine image 壓縮) | 容易(host 路徑直接複製) | 等同其中一種 |
| 移機 | docker volume inspect 找位置 | rsync 目錄過去 | 複製 compose + data 目錄 |
| 開機自啟 | 要自己寫 systemd | 要自己寫 systemd | restart: unless-stopped 內建 |
| 上手門檻 | 中 | 低 | 中 |
| 出錯救援 | 複雜 | 最簡單 | 中 |
| 推薦情境 | 小型 prod、單人維運 | dev / POC / 個人用 | 最完整、長期首選 |
✅ 想完全不煩這三種? 用 ZenClaw——MixerBox AI 做的 OpenClaw 託管服務,9 秒拿到實例,volume、備份、重啟、升級全部由我們處理。詳見 自架 vs ZenClaw 成本對照。
如何把已經在跑的容器無痛遷移到 volume(5 步驟)
容器還活著但沒掛 volume,3–5 分鐘內可以無痛遷移:先 inspect 確認、docker cp 備份、重新 run 時加 -v、驗證檔案還在。 照這 5 步做:
- 確認你中招:
docker inspect <container> | grep -A 10 Mounts,若Mounts是[]空陣列就是沒掛。 - 停掉現有容器(不刪):
docker stop openclaw。先停著,保留 container id 方便下一步 copy 檔案。 - 把容器內設定 copy 出來:
docker cp openclaw:/root/.openclaw ./openclaw_backup,先備份,避免下一步清空。 - 重新用
-v啟動:docker run -d --name openclaw -v $(pwd)/openclaw_backup:/root/.openclaw openclaw/openclaw:latest。 - 驗證:
docker restart openclaw後執行docker exec openclaw cat /root/.openclaw/openclaw.json確認設定檔還在;也可以跑openclaw config file印出目前使用的 config 路徑。
整個流程 3–5 分鐘。如果你不想再做第二次、也不想管以後其他 DevOps 細節,下一段是更省事的解法。
已經掉設定了怎麼救
依據你掉的內容不同,救法從「重設即可」到「只能重 pair」都有;sessions/ 裡的對話記憶無法救回。 以下分類:
掉了 openclaw.json(模型、gateway、channel 設定、bot token)
重新填回去即可。Telegram token 要在 @BotFather 重新 /revoke 再 /token 拿;LINE 去 developer console 重發;Slack 則要重裝 app。
掉了 sessions/(對話記憶)
沒救。之後記得掛好 volume。
掉了 credentials/whatsapp-creds.json(WhatsApp Baileys session)
只能重 pair QR code——這是 Meta 那端的限制。開後台、WhatsApp、掃 QR。這段時間使用者傳的訊息會是空窗期,會漏接。
掉了 agents/ 或 skills/(自訂 agent、裝的 plugin)
agents 自己重新設定;skills 若是從 registry 裝的可以重裝,客製化的 skill 要自己重寫。
想完全不用煩惱這題?用 ZenClaw
ZenClaw 是 MixerBox AI 做的 OpenClaw / NemoClaw 託管服務,持久化由我們負責,你永遠不用再碰 Docker volume。 你也不用寫 docker-compose、不用設備份 cron——9 秒拿到一個可用的 OpenClaw 實例就能開始交辦工作;想接 Telegram / LINE / Microsoft Teams 也是點一下的事。
想換到 ZenClaw:到 zenclaw.ai 登入,點 「立即雇用 AI 員工」,進控制台按 「新增 OpenClaw 安裝」。
小結
掉設定的絕大多數情況是 volume 沒掛好,掛了之後 restart 就穩。如果你不想之後還要處理 Baileys 掉 session、Docker 升級掉檔案、主機搬家救資料——那 ZenClaw 這種託管服務就是為你設計的。