🐳

Claude CodeをDev Containerで自動化する方法

に公開

Claude Codeで開発していると、ファイル操作やコマンド実行のたびに確認を求められます。

確認をスキップするオプションもありますが、すべてを許可するとホスト環境の重要なフォルダが一括削除されるなどのリスクがあります。

本記事では、Dev Containerで隔離された環境を構築し、Claude Codeを安全に自動実行する方法を解説します。
確認なしで、まとまったタスクを一括して任せられるようになります。

なぜDev Containerを使うのか

隔離環境は自分でDockerを構築しても作れます。ただし、Claude Code公式が.devcontainer設定を提供しているため、これを使うのが簡単です。

項目 自分で構築 公式Dev Container
Dockerfile作成 必要 不要
Claude Codeインストール 必要 済み
ファイアウォール設定 必要 済み
VSCode連携 自分で設定 済み

アーキテクチャ概要

構成要素が多いので、先に図で全体像を把握してください。

各コンポーネントの役割

コンポーネント 役割
ホストマシン 開発マシン。VSCodeとDockerが動作
Docker Desktop コンテナの実行環境を提供
Dev Container 隔離されたLinux環境。Claude Codeが動作
ワークスペース ホストのGitリポジトリがマウントされ、変更が同期される
ファイアウォール 外部通信を制限(デフォルトでホワイトリスト方式)
Node.js 20 Claude Code CLIの動作基盤

この構成のポイント

  1. 隔離: ホストマシンとDev Containerが分離されており、コンテナ内の操作がホストに影響しない
  2. ファイル同期: ホストのGitリポジトリが/workspaceにマウントされ、変更が双方向に同期される
  3. ネットワーク制限: ファイアウォールにより、許可されたサービス(Anthropic API、GitHub、npm)のみアクセス可能

デフォルトのファイアウォール

公式Dev Containerには、iptablesベースのファイアウォールが含まれています。

許可されているドメイン:

  • GitHub(API/Web/Git)
  • npm Registry
  • Anthropic API
  • Sentry(エラー監視)
  • VS Code関連サーバー

その他すべての外部通信はブロックされます。

前提条件

本記事では以下がインストールされていることを前提とします。

  • Docker Desktop
  • Visual Studio Code
  • Dev Containers拡張機能(VSCode Marketplace: ms-vscode-remote.remote-containers

動作確認はmacOSで行なっています。

構築手順の概要

全体の流れは以下の通りです。

  1. Step 1: 公式リポジトリをクローンし、.devcontainer以外を削除して初期化
  2. Step 2: VSCodeでDev Containerとして開く
  3. Step 3: コンテナ内の環境を確認
  4. Step 4: --dangerously-skip-permissionsで許可無制限モードで起動
  5. Step 5(オプション): ネットワーク制約を解除
  6. Step 6(オプション): Playwrightの依存関係を追加

NW制約の解除について

デフォルトでは、許可リスト以外の外部ドメインへのアクセスがブロックされます。npm registryやGitHub以外から外部ライブラリを取得しようとするとエラーになる場合があります。その場合はStep 5でファイアウォールを解除できます。

Playwrightについて

Claude Codeで開発する際は、E2Eテストまで実施させることを推奨します。テストが失敗した場合、Claude Codeが自動で修正を試みてくれるため、手戻りが減ります。

ただし、PlaywrightなどのOS依存ライブラリは、npmだけではインストールできません。Docker環境内ではsudo apt-getが使えないため、Dockerfileに事前に依存関係を追加する必要があります。これはStep 6で説明します。

構築手順(詳細)

Step 1: 公式リポジトリのクローンと初期化

Claude Codeの公式リポジトリをクローンし、.devcontainer以外を削除して新しいプロジェクトとして初期化します。

ターミナル(ホスト)
git clone https://github.com/anthropics/claude-code.git my-project
cd my-project
不要ファイルの削除と初期化

リポジトリには.devcontainer以外のファイルも含まれています。不要なファイルを削除し、新しいプロジェクトとしてGit管理を始める場合は以下を実行します。

ターミナル(ホスト)
# 公式リポジトリとの接続を切る
rm -rf .git

# .devcontainer以外を削除(隠しファイルも含む)
find . -maxdepth 1 ! -name '.' ! -name '.devcontainer' -exec rm -rf {} +

# 確認
ls -la

# 新しいGitリポジトリを作成
git init

# .gitignoreを作成
cat << 'EOF' > .gitignore
node_modules/
dist/
.env
.env.local
*.log
.DS_Store
EOF

# 初回コミット
git add .
git commit -m "Initial commit with Dev Container configuration"

Step 2: Dev Containerで開く

  1. VSCodeでプロジェクトフォルダを開く
  2. 右下に「Reopen in Container」の通知が表示されたらクリック
  3. 通知が表示されない場合は、Cmd + Shift + PDev Containers: Reopen in Containerを選択
  4. コンテナのビルドが実行される(初回は数分かかります)

Step 3: 動作確認

コンテナが正しく構築されたか確認します。

  • 作業ディレクトリが/workspaceであること
  • Node.js 20がインストールされていること
  • nodeユーザーで実行されていること(rootではない)
  • Claude Codeがインストールされていること
  • OSがDebian Linux(macOSではない)であること
ターミナル(コンテナ内)
pwd                      # /workspace
node --version           # v20.x.x
whoami                   # node
claude --version         # x.x.x (Claude Code)
cat /etc/os-release      # Debian GNU/Linux

ホストとの同期確認:

ターミナル(コンテナ内)
echo "hello" > test.txt

VSCodeのエクスプローラーにtest.txtが表示されれば、同期が正常に動作しています。

Step 4: 許可無制限モードで起動

以下のコマンドでClaude Codeを許可無制限モードで起動します。

ターミナル(コンテナ内)
claude --dangerously-skip-permissions

通常はplan modeauto-accept editsが表示される欄に、bypass permissions onと表示されれば成功です。

Claude Code 許可無制限モード

Step 5: ネットワーク制約の解除(オプション)

外部ライブラリの取得でエラーが発生する場合は、ファイアウォールを解除できます。

devcontainer.jsonの以下の行をコメントアウトします:

devcontainer.json
// コメントアウトしてファイアウォールを無効化
// "postStartCommand": "sudo /usr/local/bin/init-firewall.sh",

変更後、コンテナをリビルドします:

Cmd + Shift + PDev Containers: Rebuild Container

Step 6: Playwrightの追加(オプション)

E2Eテストを実行するためにPlaywrightを使用する場合、OS依存のライブラリをDockerfileに追加する必要があります。

.devcontainer/Dockerfileapt-get installにPlaywrightの依存関係を追加します。

修正前:

Dockerfile
# Install basic development tools and iptables/ipset
RUN apt-get update && apt-get install -y --no-install-recommends \
  less \
  git \
  ...省略...
  vim \
  && apt-get clean && rm -rf /var/lib/apt/lists/*

修正後:

Dockerfile
# Install basic development tools and iptables/ipset
RUN apt-get update && apt-get install -y --no-install-recommends \
  less \
  git \
  ...省略...
  vim \
  # Playwright dependencies
  libnspr4 \
  libnss3 \
  libdbus-1-3 \
  libatk1.0-0 \
  libatk-bridge2.0-0 \
  libcups2 \
  libxkbcommon0 \
  libatspi2.0-0 \
  libxcomposite1 \
  libxdamage1 \
  libxfixes3 \
  libxrandr2 \
  libgbm1 \
  libasound2 \
  && apt-get clean && rm -rf /var/lib/apt/lists/*

変更後、コンテナをリビルドします:

Cmd + Shift + PDev Containers: Rebuild Container

まとめ

本記事では、Dev Container上でClaude Codeを自動化する方法を解説しました。

ポイント

  • Dev Containerにより、ホスト環境を保護しながら--dangerously-skip-permissionsを使用可能
  • デフォルトのファイアウォール設定でセキュリティを確保
  • 必要に応じてNW制約解除やPlaywright追加が可能

参考リンク

Discussion