本文へ移動
Claude Tips

開発コンテナ

開発コンテナ(dev container)に Claude Code を入れる手順と、認証の永続化・組織ポリシーの強制・外向き通信の制限・権限プロンプトなしの運用をまとめます。

開発コンテナ(dev container)は、チームの全員が同じ隔離された環境を動かせるようにする仕組みです。そのコンテナに Claude Code を入れると、Claude が実行するコマンドはホストではなくコンテナの中で動き、プロジェクトのファイルへの編集は作業中にローカルのリポジトリへ現れます。このページは、組織の管理者が、チームの環境を揃えつつ Claude Code の動く範囲を絞るためのものです。

要点#

  • 導入は、公式の Dev Container Feature を devcontainer.json に1行足して、コンテナを再ビルドするだけ
  • 再ビルドするとホームのディレクトリが捨てられるので、認証を保つには ~/.claude へ名前付きボリュームをマウントし、CLAUDE_CONFIG_DIR を同じパスにする
  • /etc/claude-code/managed-settings.json をイメージに入れると、最優先の設定として組織のポリシーを強制できる(ただし Dockerfile はリポジトリにあるので、書き込める人は変更できる)
  • 外向きの通信を絞るファイアウォールのスクリプトと、権限プロンプトを飛ばす運用は、どちらも任意
  • 参照用のコンテナ(anthropics/claude-code リポジトリの .devcontainer)で、組み合わせ方を試せる

注意

開発コンテナは強い保護になりますが、あらゆる攻撃を防げるわけではありません。--dangerously-skip-permissions で実行すると、悪意のあるプロジェクトが、コンテナの中から届くすべて(~/.claude に保存された Claude Code の資格情報を含む)を持ち出すのを、開発コンテナは防ぎません。信頼できるリポジトリの開発にだけ使い、Claude の動きを見守ってください。~/.ssh やクラウドの資格情報のファイルのようなホストの秘密をコンテナへマウントするのは避け、リポジトリに限った短命なトークンを使います。

開発コンテナと編集環境の関係#

開発コンテナは Docker のコンテナとして、手元のマシンか GitHub Codespaces のようなクラウドのホストで動きます。Dev Containers の仕様に対応する編集環境(VS Code・GitHub Codespaces・JetBrains の IDE・Cursor)がそのコンテナへ接続します。ファイルは普段どおり編集環境で閲覧・編集しますが、統合ターミナル・言語サーバー・ビルドツールは、ホストではなくコンテナの中で動きます。素の Vim のように開発コンテナに対応しない編集環境は、この流れに含まれません。

Claude Code はコンテナの中で動くので、プロジェクトのほかのツールチェーンと同じファイル・依存・ツールが見えます。VS Code では、Claude Code の拡張のパネルを使うか、統合ターミナルで claude を実行します。どちらもコンテナの中で動き、同じ ~/.claude の設定を共有します。

Claude Code を開発コンテナに入れる#

Claude Code Dev Container Feature で、任意の開発コンテナへ入れられます。設定は、Dev Containers の仕様に対応するどのツール(VS Code・GitHub Codespaces・JetBrains の IDE)でも動き、以下の手順は VS Code を例にしています。VS Code か Codespaces でコンテナを開くと、この Feature は Claude Code の VS Code 拡張も足します(ほかの編集環境は、その部分を無視する)。

  1. devcontainer.json を作るか更新する:次の内容を、リポジトリの .devcontainer/devcontainer.json として保存するか、既存のファイルに features のブロックを足す。末尾のバージョンタグ(:1.0 など)が固定するのは Feature のインストールスクリプトで、Claude Code のリリースではない。Feature は最新の Claude Code を入れ、Claude Code は既定でコンテナ内で自分を自動更新する。image の行は、プロジェクトのベースイメージに置き換えるか、既存のファイルが Dockerfile を使うなら削除する
  2. コンテナを再ビルドする:VS Code のコマンドパレット(Mac は Cmd+Shift+P、Windows と Linux は Ctrl+Shift+P)で「Dev Containers: Rebuild Container」を実行する。ほかのツールは、そのツールの再ビルドの操作(GitHub Codespaces の再ビルド・Dev Containers CLI・IDE の開発コンテナのドキュメント)に従う
  3. Claude Code にサインインする:再ビルドしたコンテナでターミナルを開いて claude を実行し、認証のプロンプトに従う
json
{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  }
}

ベースイメージが Node.js を持たないとき、Claude Code の Feature が自分で Node.js を入れます。その導入が失敗して Failed to install Node.js and npm でビルドが止まったら、features の Claude Code の Feature の上に "ghcr.io/devcontainers/features/node:1": {} を足して再ビルドします。

認証のプロンプトの内容は、プロバイダで違います。

プロバイダ 内容
Anthropic ブラウザで、Claude か Anthropic Console のアカウントでサインインする
Amazon Bedrock・Vertex AI・Foundry Claude Code はクラウドの資格情報を使い、ブラウザのプロンプトは出ない

クラウドプロバイダでは、資格情報のファイルをホストからマウントするのではなく、containerEnv・Codespaces のシークレット・クラウドのワークロード ID で、環境変数としてコンテナへ渡します。どの方法が組織に合うかは組織への導入と管理設定を見てください。

補足

ブラウザでのサインインが終わってもコールバックがコンテナに届かないときは、ブラウザに出るコードをコピーして、ターミナルの Paste code here if prompted のプロンプトへ貼り付けます。編集環境のポート転送が localhost のコールバックを通さないときに起こります。

再ビルドをまたいで認証と設定を保つ#

既定では、再ビルドするとコンテナのホームのディレクトリが捨てられるので、エンジニアは毎回サインインし直します。Claude Code は、認証トークン・ユーザーの設定・セッションの履歴を ~/.claude に保存します。OAuth のアカウント・個人の MCP サーバー・プロジェクトごとの信頼は、そのディレクトリの外の別ファイル ~/.claude.json に保存するので、~/.claude だけにボリュームをマウントしても、サインインは保てません。~/.claude に名前付きボリュームをマウントし、CLAUDE_CONFIG_DIR を同じパスにして、.claude.json もボリュームの中へ書かせます。remoteUser が node のコンテナの例です。

json
"mounts": [
  "source=claude-code-config,target=/home/node/.claude,type=volume"
],
"containerEnv": {
  "CLAUDE_CONFIG_DIR": "/home/node/.claude"
}

/home/node は、コンテナの remoteUser のホームのディレクトリに置き換えます。すでに containerEnv を設定しているなら、2つ目を足さず、そのオブジェクトに CLAUDE_CONFIG_DIR を足します。

  • 1つのボリュームを全リポジトリで共有せず、プロジェクトごとに状態を分けるには、ボリュームのソース名に ${devcontainerId} を含める(参照用の設定は、そのために source=claude-code-config-${devcontainerId} を使う)
  • GitHub Codespaces では、~/.claude はコードスペースの停止と起動では残るが、コンテナの再ビルドで消えるので、上の設定がそこでも当てはまる
  • コードスペースをまたいで認証を持ち越すには、ANTHROPIC_API_KEY か、claude setup-token で作る CLAUDE_CODE_OAUTH_TOKEN を、Codespaces のシークレットとして保存する(Codespaces は、シークレットをコンテナ内の環境変数として自動で公開する)

組織のポリシーを強制する#

開発コンテナは、同じイメージと設定が全エンジニアのマシンで動くので、組織のポリシーを当てるのに便利な場所です。Claude Code は Linux で /etc/claude-code/managed-settings.json を読み、設定の階層で最優先として適用するので、そこにある値は、エンジニアが ~/.claude やプロジェクトの .claude/ に設定したものを上書きします。Dockerfile からファイルを置きます。

dockerfile
RUN mkdir -p /etc/claude-code
COPY managed-settings.json /etc/claude-code/managed-settings.json

Dockerfile はリポジトリにあるので、書き込み権限のある人はこの段を変更も削除もできます。エンジニアがリポジトリのファイルを編集しても回避できないポリシーにするには、代わりに、サーバー管理設定か MDM で managed settings を配ります(キーと配布経路は組織への導入と管理設定と設定ファイルの仕組み)。

コンテナ内のすべての Claude Code のセッションに効く環境変数は、devcontainer.json の containerEnv に足します。次の例は、テレメトリとエラー報告をオプトアウトし、導入後の自動更新を止めます。

json
"containerEnv": {
  "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
  "DISABLE_AUTOUPDATER": "1"
}

CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC は、リモートコントロールなどの「機能フラグの取得が要る機能」が頼る機能フラグの評価も止めるので、コンテナ内のセッションではそれらが使えません。

  • Dev Container Feature は常に最新の Claude Code のリリースを入れる。再現できるビルドのためにバージョンを固定するなら、Feature の代わりに Dockerfile から npm install -g @anthropic-ai/claude-code@X.Y.Z で入れ、containerEnv の DISABLE_AUTOUPDATER を 1 にする
  • 権限ルール・ツールの制限・MCP サーバーの許可リストを含むポリシーの制御の全体は、組織への導入と管理設定を見る
  • コンテナの中で MCP サーバーを使えるようにするには、リポジトリのルートの .mcp.json にプロジェクトのスコープで定義し、開発コンテナの設定と一緒にチェックインする。ローカルの stdio サーバーが依存するバイナリは Dockerfile で入れ、リモートのサーバーのドメインはネットワークの許可リストに足す

外向きの通信を制限する#

コンテナの外向きの通信を、Claude Code が要るドメインだけに絞れます。推論と認証のドメインはネットワークと LLM ゲートウェイの「通信先の許可リスト」を、省略可のテレメトリとエラー報告の接続とその止め方はセキュリティとデータの扱いを見てください。

参照用のコンテナには、スクリプトが許可する宛先に外向きを絞る init-firewall.sh が入っています。コンテナの中でファイアウォールを動かすには追加の権限が要るので、参照用の設定は runArgs で NET_ADMIN と NET_RAW のケーパビリティを足します。ファイアウォールのスクリプトとこれらのケーパビリティは、Claude Code 自体には必須ではなく、外して自前のネットワーク制御に頼ってもかまいません。

権限プロンプトなしで動かす#

コンテナが Claude Code を root でないユーザーで動かし、コマンドの実行をコンテナの中に閉じ込めるので、無人運用のために --dangerously-skip-permissions を渡せます。root で起動すると CLI はこのフラグを拒否するので、remoteUser が root でないアカウントになっていることを確かめます。

権限プロンプトを飛ばすと、ツールの呼び出しを実行前に確認する機会がなくなります。Claude は、ホストへそのまま現れるバインドマウントのワークスペースのどのファイルも変更でき、コンテナのネットワークポリシーが許すものへ届きます。迂回したセッションが届く範囲を絞るため、上の外向きの制限と組み合わせます。

ヒント

安全の確認を外さずにプロンプトを減らしたいなら、代わりに、実行前に分類器がアクションをレビューする auto モードを検討してください(権限モード)。エンジニアが --dangerously-skip-permissions を使うこと自体を止めるには、managed settings で permissions.disableBypassPermissionsMode を "disable" にします(設定キー一覧)。

参照用のコンテナを試す#

anthropics/claude-code のリポジトリには、CLI・外向きのファイアウォール・永続ボリューム・Zsh ベースのシェルを組み合わせた、開発コンテナの例が入っています。保守されるベースイメージではなく、動く例として提供されているので、各部品がどう組み合わさるかを見るのに使い、自分の設定へ適用する前に確かめます。

  1. 前提を入れる:VS Code と Dev Containers 拡張
  2. 参照を clone する:Claude Code のリポジトリを clone して VS Code で開く
  3. コンテナで開き直す:促されたら「Reopen in Container」を選ぶか、コマンドパレットで「Dev Containers: Reopen in Container」を実行する
  4. Claude Code を始める:コンテナのビルドが終わったら、Ctrl+<kbd></kbd> でターミナルを開き、claude` を実行してサインインし、最初のセッションを始める

自分のプロジェクトでこの設定を使うには、.devcontainer/ のディレクトリをリポジトリへコピーして、Dockerfile をツールチェーンに合わせて直すか、すでにある設定へ Feature だけを足します。参照用の設定は3つのファイルでできています。Feature で自分の開発コンテナに Claude Code を入れるなら、どれも必須ではありませんが、部品を組み合わせる1つの形を示します。

ファイル 役割
devcontainer.json ボリュームのマウント・runArgs のケーパビリティ・VS Code の拡張・containerEnv
Dockerfile ベースイメージ・開発ツール・Claude Code の導入
init-firewall.sh 外向きの通信を、スクリプトが許可する宛先に限る

関連するページ#

開発コンテナで Claude Code が動いたあとの、組織への展開の残りは、次のページにあります。

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧