0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NanoClaw v2 のエージェントコンテナにホストディレクトリをバインドマウントする

0
Posted at

はじめに

NanoClaw v2 のエージェントコンテナは additionalMounts という仕組みで、ホスト側の任意のディレクトリをコンテナ内にマウントできます。ただし設定方法にいくつかの落とし穴があります。この記事では実際に動作した手順を正確にまとめます。

環境

  • NanoClaw v2(GitHubクローン、~/nanoclaw-v2/
  • Ubuntu 22.04、systemd ユーザーサービスで起動

仕組みを理解する

マウント処理には3つの要素が絡み合います:

要素 役割
~/.config/nanoclaw/mount-allowlist.json マウントを許可するホストパスのセキュリティ設定
v2.dbcontainer_configs.additional_mounts 実際にマウントする設定(正しいデータソース)
groups/<folder>/container.json DBから毎回生成されるファイル(直接編集しても無効)

重要な落とし穴: container.json はコンテナ起動のたびにDBから materializeContainerJson() で上書き生成されます。このファイルを直接編集しても次の起動時に元に戻ります。設定は必ず DB を更新する必要があります。

手順

ステップ 1: マウント先ディレクトリをホストに作成

sudo mkdir -p /var/data
sudo chown $USER:$USER /var/data

ステップ 2: マウント許可リスト(allowlist)を作成

mkdir -p ~/.config/nanoclaw
cat > ~/.config/nanoclaw/mount-allowlist.json << 'EOF'
{
  "allowedRoots": [
    {
      "path": "/var/data",
      "allowReadWrite": true,
      "description": "Shared data directory"
    }
  ],
  "blockedPatterns": []
}
EOF

allowedRoots にはマウントしたいパスの親ディレクトリ以上のパスを指定します。allowReadWrite: true で読み書き可能になります。

なぜ必要か: このファイルは NanoClaw のセキュリティ機構です。ここに登録されていないパスはすべてマウントが拒否されます。ファイルが存在しない場合、additionalMounts は全件ブロックされます。

ステップ 3: DB に additionalMounts を設定

ここが最重要ステップです。container.json を直接編集せず、DBを更新します。

# エージェントグループIDを確認(例)
sqlite3 ~/nanoclaw-v2/data/v2.db \
  "SELECT id, name FROM agent_groups;"

# additional_mounts を更新
sqlite3 ~/nanoclaw-v2/data/v2.db \
  "UPDATE container_configs
   SET additional_mounts = '[{\"hostPath\":\"/var/data\",\"containerPath\":\"data\",\"readonly\":false}]'
   WHERE agent_group_id = 'YOUR_AGENT_GROUP_ID';"

# 確認
sqlite3 ~/nanoclaw-v2/data/v2.db \
  "SELECT additional_mounts FROM container_configs WHERE agent_group_id = 'YOUR_AGENT_GROUP_ID';"

additional_mounts のフォーマット:

[
  {
    "hostPath": "/var/data",
    "containerPath": "data",
    "readonly": false
  }
]

containerPath は相対パスで指定します。 コンテナ内では自動的に /workspace/extra/<containerPath> にマウントされます。例えば "containerPath": "data" → コンテナ内の /workspace/extra/data になります。

ステップ 4: コンテナを再起動

現在動いているコンテナを停止します。次のメッセージ送信で新しい設定が適用されたコンテナが起動します。

# 現在のコンテナ名を確認
docker ps | grep nanoclaw

# コンテナを停止
docker stop nanoclaw-v2-<group-folder>-<timestamp>

ステップ 5: 動作確認

コンテナ内(エージェントに依頼)からアクセスできるか確認します。

# コンテナ内で実行(エージェントが実行)
ls /workspace/extra/data
echo "Hello from container!" > /workspace/extra/data/test.txt

ホスト側で確認:

cat /var/data/test.txt
# Hello from container!

セキュリティの考慮

allowlist には以下のパターンがデフォルトでブロックされています(~/.ssh.aws.env などの認証情報パス)。blockedPatterns で追加のブロックも設定可能です。

まとめ

設定場所 内容
~/.config/nanoclaw/mount-allowlist.json 許可するホストパスのセキュリティ設定
v2.dbcontainer_configs.additional_mounts マウント設定(これが正規のデータソース)

コンテナ内からは /workspace/extra/<name> でアクセスできます。container.json を直接編集しても DBで上書きされるため、必ず SQLite で DB を更新してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?