🗄️

もうローカル環境を汚さない! DevContainer上でセキュアに Claude CodeとMCPサーバーを動かそう

に公開

はじめに

  1. ローカル環境に起因した挙動違いは大嫌い
  2. 秘匿情報は、もちろんGitに登録しない
  3. Claude CodeやMCPサーバーの設定は、なるべくチーム共通のもの使い、GitHubのリポジトリ可能な限り設定ファイルを登録して共有する
  4. Claude Codeで使うLLMはBedrock経由で利用
  5. (任意)Python + uv + ruff + ty で開発したい

以上の条件を満たす皆さんいらっしゃいませ。

複数のリポジトリで開発しているとローカル環境が汚れて、意図せずさっき設定したAプロジェクト用の設定をBプロジェクトで使ってしまうことがありませんか?
今回、Devcontainerを使って、毎回クリーンで再現可能な開発環境を構築する仕組みを作成しました。

お急ぎの方は、 https://github.com/arrowkato/devcontainer_claude_code_template をよしなにカスタマイズしてご利用ください。

システム構成

主要コンポーネント

  • Docker: いつもの
  • VSCode or それをforkしたエディタ: お好みのものを使ってください。
  • Devcontainer: VSCodeの拡張機能。起動したコンテナにアタッチした状態で色々編集できるのが魅力
  • Claude Code: みんな大好き Coding Agent(AWS Bedrock経由での利用を想定)
  • MCP サーバー: なんでもいいのですが、API Keyを使う o3-search-mcp を使っています。
  • AWS CLI v2: AWSのCLIツール。BedrockでClaude4などのLLMを使うために設定。(AnthropicのAPIを直接利用して、Claude Codeを利用する場合は不要)
  • Python環境: Python 3.13 + uv + ruff + ty。 Pythonである必要もないのですが、僕が好きな言語なので

アーキテクチャ図

┌─────────────────────────────────────────┐
│ Host Machine                            │
├─────────────────────────────────────────┤
│ .aws.env (AWS認証情報)                   │
│ .env (OpenAI API Key等)                 │
│ ↓ (環境変数として注入)                    │
├─────────────────────────────────────────┤
│ Docker Container                        │
│ ├─ Claude Code CLI                      │
│ ├─ MCP Server (o3-search)               │
│ ├─ Python 3.13 + uv                    │
│ └─ AWS CLI v2                           │
└─────────────────────────────────────────┘

セキュリティ面での利点

1. 認証情報の分離

# .aws.env (Gitにコミットされない)
AWS_ACCESS_KEY_ID=<your-access-key-id>
AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
AWS_DEFAULT_REGION=<your-default-region>
CLAUDE_CODE_USE_BEDROCK=1
ANTHROPIC_MODEL="us.anthropic.claude-sonnet-4-20250514-v1:0"

# .env (Gitにコミットされない)
OPENAI_API_KEY="your-openai-api-key-here"

2. 環境変数による安全な注入

compose.yamlで環境変数ファイルを指定:

services:
  app:
    env_file:
      - .aws.env  # AWS/Claude認証情報
      - .env      # その他API Keys
    volumes:
      - ~/.gitconfig:/root/.gitconfig:ro

技術的な実装詳細

Dockerfile設計

マルチステージビルドをしています。uv_base をベースに、Claude Code に必要なものは、develop でインストールします。
必要に応じて、release 用のステージを作ってもらっても構いません。

注意事項としては、aws cli は、CPUによってインストール方法が違います。
aarch64 対応のものをこのリポジトリでは書いているので、x86_64 のCPUをお使いの場合は、適宜書き換えてください。

# install AWS CLI v2 for aarch64
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && ./aws/install \
    && rm -rf awscliv2.zip aws

# install AWS CLI v2 for x86_64
# RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
#     && unzip awscliv2.zip \
#     && ./aws/install \
#     && rm -rf awscliv2.zip aws

MCP設定

API Keyを使うMCPサーバーならなんでもいいのですが、今回は o3-search-mcpを設定しています。

例として、
.mcp.jsonでo3-search MCPサーバーを設定:

{
    "mcpServers": {
        "o3": {
            "command": "npx",
            "args": ["o3-search-mcp"],
            "env": {
                "SEARCH_CONTEXT_SIZE": "medium",
                "REASONING_EFFORT": "medium"
            }
        }
    }
}

OPENAI_API_KEYを設定する必要がありますが、.mcp.jsonに API Key を書いて、git 登録するわけにはいきません。
回避策として、コンテナの外から環境変数 OPENAI_API_KEY を渡しているので、.mcp.json では設定しません。

"env": {
    "OPENAI_API_KEY": "sk-xxxxxxxxx", // git登録ダメ。ゼッタイ
    "SEARCH_CONTEXT_SIZE": "medium",
    "REASONING_EFFORT": "medium"
}

注: コンテナ内で echo $OPENAI_API_KEY すると、API Keyが表示されるはずです。

開発ワークフロー

1. 初期セットアップ

# リポジトリクローン
git clone https://github.com/arrowkato/devcontainer_claude_code_template
cd devcontainer_claude_code_template

# AWS認証情報とAPI Keyを設定
cp .aws.env.sample .aws.env
# 必要な情報を.aws.envに入力してください。
# .aws.env は .gitignore に登録されているので、Gitにはコミットされません。

# 環境設定ファイル作成
cp .env.sample .env
# 必要な情報を.envに入力してください。
# .env は .gitignore に登録されているので、Gitにはコミットされません。

2. 開発環境起動

VSCode Devcontainer使用時:

このリポジトリをcloneした後、VSCodeで開き、以下のコマンドを実行します。

  • OSX: Cmd+Shift+P → "Dev Containers: Rebuild Without Cache and Reopen in Container" をtypeしてそれを選択
  • Windows: Ctrl+Shift+P → "Dev Containers: Rebuild Without Cache and Reopen in Container" をtypeしてそれを選択

Docker Compose使用時:

docker compose up -d --build

3. 使用例

# ご存知Claude Codeの起動コマンド
claude
# 初期設定で何かしら聞かれるので回答
# CLAUDE_CODE_USE_BEDROCK=1 を環境変数に設定しているなら、Anthropicとの直接認証にはならないはずです。
今日の沖縄のお天気は?

あたりを聞いて下さい。o3:o3-search(MCP) を使っているなら成功です。
こんな感じです。

o3_search_result

まとめ

この構成により以下が実現できました:

  • セキュア: 認証情報のGit除外
  • 再現性: 毎回同じでクリーン環境
  • 設定の共有: .mcp.jsonやClaude.mdや .claude/ 配下のファイル

Claude Codeをローカル環境に依存せずセキュアに使いたい場合の参考になれば幸いです。

参考リンク

Discussion