複数のDevContainerでclaude-memの記憶を引き継ぐ

複数のDevContainerでclaude-memの記憶を引き継ぐ

Claude Codeのメモリプラグイン「claude-mem」をDevContainerで使う際、複数コンテナ間でデータを共有できない問題を、ホストPCでworkerを常駐させsocatプロキシとSQLiteのbind mountで解決する方法を紹介します。
2026.02.26

Claude Codeのメモリ機能を拡張するMCPプラグイン「claude-mem」が便利です。
過去のコンテキストを再活用したり、共有したりすることができます。

しかし、DevContainerで開発していると困ることがありました。

複数のDevContainerでclaude-memの情報が共有できないという問題です。

この記事では、claude-memの情報をDevContainer間で共有するため、ホストPCでワーカーを常駐させsocatでプロキシしつつ、SQLiteデータベースをbind mountで共有する方法を紹介します。

弊社ブログでDevContainerでのClaude Codeセットアップや、claude-memについて解説していますので、合わせてご覧ください。

https://dev.classmethod.jp/articles/setup-claude-code-in-devcontainer/

https://dev.classmethod.jp/articles/claude-mem-claude-code-cursor/

最初に結論

ホストPCでclaude-memのワーカーを起動し、docker-compose.ymlにsocatリレーの追加とSQLiteのbind mountを設定します。

docker-compose.yml
services:
  claude-mem-proxy:
    image: alpine/socat:latest
    command: TCP-LISTEN:37777,fork,reuseaddr TCP:host.docker.internal:37777

  app:
    # ...(既存設定)
    volumes:
      # ホストのSQLiteをDocker上のホームフォルダにマウント
      - ~/.claude-mem:/home/node/.claude-mem
    network_mode: "service:claude-mem-proxy"
    depends_on:
      - claude-mem-proxy

WorkerへのHTTP通信は claude-mem-proxy 経由でホストPCのワーカーへ届き、HookからのSQLite直接書き込みはbind mountでホストPCのDBファイルへ届きます。

claude-memとは

claude-mem は、Claude Codeのセッション内容を自動で記録し、AIで整理したうえでローカルDBに保存するプラグインです。

保存された情報は全文検索(SQLite)とベクトル検索(ChromaDB)を組み合わせたハイブリッド検索で取り出され、次回以降のセッションにコンテキストとして活用できます。

https://github.com/thedotmack/claude-mem

claude-memの構成

claude-memプラグインは主に以下の3つのコンポーネントで構成されています。

Worker

localhost:37777 で動くHTTPサーバーです。バックグラウンドで常駐して、全文検索のAPIエンドポイントやViewer UIを提供します。

Hook

Claude Codeのライフサイクルに応じて発火するイベントハンドラーです。SessionStart・UserPromptSubmit・PostToolUse・Stop等のタイミングで動作します。データの保存はSQLiteに直接書き込むか、またはWorkerへHTTP POSTされて非同期に処理されます。

MCP

過去セッションの記憶を検索・取得するMCPです。
Claude Codeから呼び出され、WorkerのHTTP APIへリクエストを送ってデータを取得します。

イメージ的にはこんな感じです。

参考

解決策:ホストPCでワーカーを動かしてプロキシ&SQLiteの共有

前述のアーキテクチャを踏まえると、devcontainerでホストのclaude-memを使うには2つの橋渡しが必要です。
WorkerへのHTTPリクエストはsocatでホストへ転送し、Hookの直接DB書き込みはbind mountでホストのSQLiteファイルを共有します。

socatでホストPCへ転送する方法については、先日ブログを書きましたのでこちらをご参照ください。

https://dev.classmethod.jp/articles/access-host-service-from-docker-at-localhost-using-socat/

イメージ的にはこんな感じです。

この構成のポイントは以下のとおりです。

  • WorkerへのHTTP通信はsocatリレー経由でホストPCのワーカーへ転送する
  • HookからのSQLite直接書き込みはbind mountでホストPCのDBファイルを参照する
  • 複数のDevContainerが同じホストのワーカーとDBを共有するため、記憶が自然に共有される
  • コンテナを再作成してもホストのワーカーとDBが残り続けるため、記憶が保たれる

手順

前提条件

  • ホストPCにClaude Code、claude-memプラグインがインストール済み
  • Docker、Docker Composeがインストール済み

1. ホストPCでclaude-mem workerをHTTPサーバーとして起動する

ホストPCでclaude-mem workerをネットワーク経由でアクセスできるサーバーとして起動します。

一番手っ取り早いのが、ホストPC側でclaude-memプラグインをインストールした環境のClaude Codeを起動して、SessionStartフックでworkerを起動させてしまうことです。

hooksのcommandを見ればworkerの起動方法がわかるので、これをスクリプトやaliasにしておいてもいいかもしれません。

参考:claude-mem/plugin/hooks/hooks.json at main · thedotmack/claude-mem

2. docker-compose.ymlを編集する

私はdevcontainerの設定をdocker composeでしているので、docker composeで説明します。
docker-compose.ymlclaude-mem-proxy サービスを追加し、devcontainerの主体としている app サービスのネットワークを共有します。

docker-compose.yml
services:
  # ホストPCのclaude-memワーカーへの中継サービス
  claude-mem-proxy:
    image: alpine/socat:latest
    command: TCP-LISTEN:37777,fork,reuseaddr TCP:host.docker.internal:37777
    ## Linux環境の場合は必要
    # extra_hosts:
    #   - host.docker.internal:host-gateway

  app:
    # ...(既存設定)
    volumes:
      # ホストのSQLiteをDocker上のホームフォルダにマウント
      - ~/.claude-mem:/home/node/.claude-mem
    network_mode: "service:claude-mem-proxy"
    depends_on:
      - claude-mem-proxy

3. devcontainerを再ビルドする

設定後、devcontainerを再ビルドします。

VS CodeのコマンドパレットでRebuild Containerを実行します。

4. Docker上のClaude Codeでclaude-memプラグインをインストールする

Docker上でClaude Codeを起動して、claude-memプラグインをインストールします。
手順はホストPCでclaude-memプラグインをインストールするのと変わらないので省略します。

動作確認

Docker上から、ホストPCのworkerが見えていればOKです。

# コンテナ内で実行
$ curl localhost:37777/health
{"status":"ok","timestamp":1772071782619}

Claude Codeのチャットで /mem-search スキルを使ってみると、以前のセッションの記憶が検索できることが確認できます。

# コンテナ内で実行(Claude Code)
/mem-search ちゃんと過去のデータが取れてるか確認したい
● 検索できています。いくつかの記録の詳細を確認します。

● plugin:claude-mem:mcp-search - get_observations (MCP)(ids: [361,360])
  ⎿  [
       {
         "id": 361,
     … +42 lines (ctrl+o to expand)

● 過去のデータが正常に取得できています。

  確認結果:
  - 検索: "blog" クエリで26件ヒット(観測10件、セッション10件、プロンプト6件)
  - 最新記録: 2026年2月25日のデータまで記録済み
  - 詳細取得: ID #360, #361 の完全なデータ(facts, narrative, concepts)が正常に返ってきた

  過去の作業履歴がすべてちゃんと保存・検索できています。メモリシステムは正常に動作しています。

おわりに

普段はAIエージェントのアクセス範囲をコンテナ内に限定したいというセキュリティ上の懸念からdevcontainerで環境を閉じた開発をしています。

claude-memプラグインはとても興味深かったのですが、devcontainerとは相性が悪かったです。

この構成であればセキュリティと利便性のバランスが取れそうだなと思いました。

このブログがどなたかのお役に立てれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事