2026年版 OpenClaw Docker ボリュームと権限
永続設定・書き込み可能な Skills・再起動後の状態

読了目安 約21分 · MACCOME

Docker / Compose 上で OpenClaw Gateway を動かすチームが最も時間を溶かすのは、イメージの pull ではなく、再起動・アップグレード・docker compose down でペアリングや設定が消えることや、Skills ディレクトリが読み取り専用で公式トラブルシュートのネットワーク項目と噛み合わない Permission denied の連発です。本稿は Docker ネットワーク切り分けインストール後の doctor 切り分けDocker 本番と Gateway 運用無人リモート Mac 運用と役割分担します。ボリューム/権限の落とし穴六つ、永続対象とアンチパターンの表二枚、症状→コマンド→修正のマトリクス、コピペ用 inspect スニペット、六ステップの手順、ダッシュボード向け指標三つをまとめます。切り分け順は まずボリュームと UID/GID、次にネットワークとリバースプロキシです。

「再起動したらリセットされる」を RCA 向けのボリューム要因六つに分解する

イメージは不変のテンプレートです。書き込み可能レイヤー、anonymous ボリューム、永続化されていないパスにだけ書かれた状態は消えます。以下のシグナルを変更チケットに記録し、Compose の改訂やイメージタグと同じ行でレビューしてください。

  1. anonymous/名前なしマウント:Compose がホスト bind なしでコンテナ内パスだけ宣言していると、down -v やクリーンアップで「git は変えていないのに」ペアリングキャッシュが消えます。
  2. リモート Mac で bind パスがズレる:ホーム、同期フォルダ、一時マウントが動くと、bind が空ディレクトリや古いスナップショットを指したまま Gateway は起動します。
  3. UID/GID の食い違い:コンテナ内プロセスユーザーとホスト所有者が一致せず、Skills のホットリロードやログ書き込みが失敗します。Docker Desktop(macOS)と Linux ホストでは挙動が分岐し、user を調整せずに Compose を流用するのは典型失敗です。
  4. 読み取り専用の誤用:設定や Skills を「セキュリティ」で :ro にすると、上流例が想定するトークンキャッシュやローカル状態が書けません。再起動まで気づかないこともあります。
  5. 状態が書き込みレイヤーだけ:docker commit は魅力的に見えますが、タグ変更でそのレイヤーは捨てられます。本番では避けてください。
  6. 調整なしの同時書き込み:実験用の Compose が二つ同じディレクトリを bind し、JSON を壊したり設定を半端に書きます。

ネットワーク切り分けでは CLI が不安定に成功するのに再起動後は必ず失敗する場合は、network_mode やプロキシに触る前に、名前付きボリュームが想定ディスクに載り、プロセスユーザーが Skills に書けるかをここで確認し直してください。

表1:Docker で OpenClaw に永続化すべきもの—よくあるアンチパターン

サブパスはイメージとドキュメントに従います。表が問うのは 三つの設計問い:コンテナライフサイクルを越えて残るか、バックアップが要るか、共有の読み取り専用でよいかです。README とオンコール手順書に答えを残してください。

分類永続化の典型内容推奨パターンアンチパターン
設定とシークレット素材Gateway エンドポイント、プロバイダ選択、チャネルトークンのパスホスト bind または名前付きボリューム。実行ユーザーに合わせた権限イメージに焼き込む。同期ツールが掃除する配下に置く
ランタイムとペアリングデバイスペアリングとセッション復元の状態専用の bind サブツリー。アップグレード前に tarCompose に文書化されていない anonymous ボリューム。単一の prune で全消去
Skills/拡張チーム所有のスキルファイルとスクリプトリポジトリ横に bind。CI と本番でパスを一致ランタイムキャッシュが書ける必要があるのに :ro。UID が書けない
ログとバッファ大きなログ、エクスポート別ボリュームまたはローテーション付きホストパス書き込みレイヤーを埋めて OOM や想定外の読み取り専用 FS にする

表2:症状→確認→修正(ネットワークより先にボリューム)

確認中は 同じシェルセッションでイメージ ID、Compose プロジェクト名、ボリューム名をログに残し、ロールバックを簡単にしてください。本番運用のリリースチェックリストも再利用します。

症状最初に確認典型的な修正まだダメなら
docker compose up のたびに新規インストールのようだdocker inspect の Mounts と期待ホストパス。最近の -v 掃除明示的 bind または名前付きボリューム。down-v を使うか文書化正しい Compose プロジェクトディレクトリにいるか確認
Skills が無視される/書き込み失敗コンテナ内 id とホスト ls -ln の所有者userchmod、Dockerfile/entrypoint で UID を揃えるマウントが :ro でないか確認
権限エラーが連続Linux の SELinux/AppArmor。macOS の Docker Desktop ファイル共有Linux:セキュリティ基準に沿ってラベルや :z を評価。macOS:ファイル共有にパス追加ディスク全体の読み取り専用を切り分けてからネットワークに戻る
イメージ更新後に半端に動く設定スキーマ変更。古いデータディレクトリがまだマウントされているリリースノートに従い、アップグレード前にバックアップ破壊的変更を openclaw doctor で照合
bash
# 1) マウントは期待するホストパスに載っているか?(コンテナ名は置換)
docker inspect -f '{{ json .Mounts }}' <container> | jq .

# 2) コンテナ内の実行ユーザー(ホスト所有者と比較)
docker exec -it <container> id

# 3) Compose プロジェクトとボリューム(anonymous のドリフト回避)
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 では、bind は多くの場合ユーザーホーム配下に収まります。Linux クラウドホストでは user 行と権限モデルが異なることがあります。「手元のノートで動いた」が「プールされたホストでも動く」とは限りません。

六ステップ手順:「コンテナは動く」から「再起動・アップグレード後も状態が残る」まで

  1. データプレーンを描く:設定、ランタイム、Skills、ログの bind をアーキ図にラベルし、本番運用のサービス図と突き合わせます。
  2. 暗黙の anonymous ボリュームを禁止:再起動後も残すパスは Compose ですべて名前付きにし、README に down -v が壊すものを明記します。
  3. UID/GID 方針を固定:コンテナ内ユーザーを決め、ホスト側の所有者または ACL を揃え、マルチホストプールでは Ansible や cloud-init に落とし込みます。
  4. アップグレード前にバックアップ:bind ルートを日時付き tarball にし、古いイメージダイジェストと Compose リビジョンを記録します。
  5. doctor の前にボリューム健全性:Mounts が正しそうなあとで openclaw doctor とチャネルプローブを実行し、偽陰性を避けます。
  6. オンコールに埋め込む:第一歩で本表とネットワーク記事の表1を開き、ネットワークとストレージを並行編集しないようにします。

ダッシュボードとポストモーテム向けの指標三つ

  1. ボリューム網羅率:必須の永続パスが明示 bind または名前付きボリュームになっている割合。ステージングでも 100% 未満なら本番準備完了とは言えません。
  2. 権限失敗率:コンテナログで Permission deniedEACCES をフィルタし、Gateway アップグレードと相関すれば多くはマウント側の問題です。
  3. 状態バックアップの周期:各アップグレードでアーカイブがあったかを記録します。2026 年によくある失敗は「アップグレードは成功したが bind が別ホストにあったのを誰も覚えていない」です。口頭の RPO を守るためバックアップは Gateway ディスクの外にも置きます。

リモート Mac 運用の記事のディスク・ログ指標と並べてください。ボリューム問題は CPU スパイクの前に、ディスク肥大や読み取り専用マウントとして現れがちです。

多くのチームが 2025〜2026 年に Gateway と Skills を同一ホストツリーに置きます。ログ専用サブツリーにクォタがないと、ログが bind を埋めて設定書き込みを阻むことがあります。コンテナを作り直し続ける前にローテーションかボリューム分割をしてください。

docker compose restartdownup も区別してください。前者は宣言されたボリュームを多くの場合保持し、後者はクリーンフラグ次第でデータの行方が変わります。運用では動詞のチートシートを共有してください。

ノートだけの Docker 実験が無人 Gateway にスケールしにくい理由

単一ユーザーのノートの権限は、自動ログインのプールされたリモートホストとは異なります。スリープ、同期ユーティリティ、手動の bind 編集が「昨日は動いた」を再現不能にします。OpenClaw を 24/7 の制御面として運用するには 契約されたパス、巻き戻し可能なアップグレード、監査可能な権限が必要です。

個人機材での学習ループは問題ありませんが、本番コストはページャと死んだチャネルとして現れます。安定マウントのない短命スクラッチコンテナはアップグレード時に失敗領域を増やします。常時オン、バックアップ向き、持ち運びやすい Gateway が必要なチームは、個人 Docker の無限調整より、Apple Silicon ベアメタルとマルチリージョン選択のプロ用 Mac クラウドに早く収束しがちです。MACCOME は地域横断の Mac mini M4 / M4 Pro レンタルと公開ヘルプを提供しています。ヘルプセンター料金から始め、リージョン別のチェックアウトを選んでください。

ロールアウトのコツ:チャネルとモデルを配線する前に、本番と同じホスト種別(Docker Desktop か Linux)で表2の確認を走らせ、「ローカルでは動くがクラウドでは失敗する」UID とパスのズレを避けます。

Kubernetes も併用する場合、Pod は Compose より頻繁に入れ替わります。PVC に載っていないものはローリング更新で消えます。明示的永続化の原則は同じで、kubectl describe pvc とマウントマニフェストで検証してください。

FAQ

Docker ネットワーク切り分けの記事と何が違いますか?

ネットワークは接続性と名前空間を扱い、本稿はディスク上のデータと書き込み可否を扱います。インストールの入口は三プラットフォーム導入ガイドを参照してください。接続と料金:ヘルプセンターレンタル料金です。

doctor とボリューム、どちらを先にしますか?

まずボリュームと権限、その後 doctor です。コンテナを作り直し続けると偽陽性になります。WSL2 の詳細はインストール後 doctor の記事にあります。

リモート Mac 運用の記事とどう組み合わせますか?

そちらは launchd/systemd、ログ、ハング切り分けを扱い、本稿は Docker の永続性と書き込み可否を扱います。どちらも同一の変更レビューとオンコール索引に入れてください。