Claude Code を開発コンテナ(dev container)で動かす:設定と組織のルール

結論

  • 開発コンテナに Claude Code を入れると、Claude が実行するコマンドはコンテナ内で動き、ファイル編集は手元のリポジトリに反映されます。
  • 導入は devcontainer.json にフィーチャーを足して再ビルドしますが、再ビルドで認証が消えるため ~/.claude の永続化が要ります。
  • 組織のルールは managed-settings.json で入れられますが、Dockerfile 経由はリポジトリの書き込み権限者が変更できる点に注意が必要です。

開発コンテナで何ができるか

執筆時点(2026年10月)の公式ドキュメントによると、開発コンテナ(dev container)は、チーム全員が同じ分離された環境を動かすための定義です。Claude Code(Anthropic 社が提供する、ターミナルで動く AI コーディングエージェント)をその中に入れると、Claude が実行するコマンドはホストではなくコンテナ内で動き、プロジェクトファイルの編集は手元のリポジトリに反映されます。

接続できるのは VS Code、GitHub Codespaces、JetBrains IDE、Cursor など Dev Containers 仕様に対応したエディタです。素の Vim のような非対応エディタは対象外です。

公式ドキュメントの警告では、--dangerously-skip-permissions で実行すると、悪意あるプロジェクトによるコンテナ内の情報の持ち出し(~/.claude の認証情報を含む)は防げません。信頼できるリポジトリでだけ使い、Claude の動きを監視し、~/.ssh などホストの秘密情報はマウントしないよう勧められています。

出典: Development containers

Claude Code を開発コンテナに追加する

公式ドキュメントでは、Claude Code Dev Container Feature を使うと、どの開発コンテナにも Claude Code を入れられます。手順は VS Code の例です。.devcontainer/devcontainer.json に次を保存するか、既存ファイルに features ブロックを足します。

{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  }
}

末尾の :1.0 のようなバージョンタグが固定するのはフィーチャーのインストールスクリプトで、Claude Code 本体ではありません。フィーチャーは最新の Claude Code を入れ、コンテナ内では既定で自動更新されます。image の行は自社の基本イメージに置き換えるか、Dockerfile を使う場合は削除します。

  1. 上の内容を devcontainer.json に保存する
  2. コマンドパレットで Dev Containers: Rebuild Container を実行する
  3. 再ビルドしたコンテナのターミナルで claude を実行し、認証の案内に従う

Node.js が基本イメージに無ければフィーチャーが入れますが、失敗して Failed to install Node.js and npm でビルドが止まったら、"ghcr.io/devcontainers/features/node:1": {} を Claude Code フィーチャーの上に足して再ビルドします。Amazon Bedrock などのクラウドプロバイダーでは、ホストの認証情報ファイルをマウントせず、containerEnv などで環境変数として渡すよう勧められています。

出典: Development containers

再ビルドで認証を消さない設定

公式ドキュメントによると、既定ではコンテナのホームが再ビルドで破棄され、毎回サインインし直しになります。認証トークンやセッション履歴は ~/.claude にありますが、OAuth アカウントなどは別ファイル ~/.claude.json にあるため、ボリュームのマウントだけでは足りません。~/.claude に名前付きボリュームをマウントし、CLAUDE_CONFIG_DIR を同じパスにします。次は remoteUser が node の例です。

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

/home/node は自分の remoteUser のホームに置き換え、すでに containerEnv がある場合はそこに足します。プロジェクトごとに分けたい場合は、ボリューム名に ${devcontainerId} を含めます。GitHub Codespaces では、停止・開始では残りますが再ビルドで消えるため、同じ設定が要ります。codespace をまたぐには、ANTHROPIC_API_KEY か、claude setup-token で得た CLAUDE_CODE_OAUTH_TOKEN を Codespaces のシークレットに保存します。

出典: Development containers

組織のルールを入れる

公式ドキュメントでは、Claude Code は Linux で /etc/claude-code/managed-settings.json を読み、設定の階層で最も高い優先順位で適用するとしています。~/.claude やプロジェクトの .claude/ の値より優先され、Dockerfile から次のようにコピーします。

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

ただし Dockerfile はリポジトリにあるため、書き込み権限のある人はこの手順を変更・削除できます。エンジニアが回避できない運用にするには、サーバー管理設定か MDM での配布が案内されています。

コンテナ全体の環境変数は containerEnv に書きます。次の例はテレメトリとエラー報告を無効化し、自動更新を止めます。

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

CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC は Remote Control などが依存するフィーチャーフラグの評価も無効にするため、コンテナ内ではそれらが使えません。バージョンを固定したいときは、フィーチャーの代わりに Dockerfile で npm install -g @anthropic-ai/claude-code@X.Y.Z を実行し、DISABLE_AUTOUPDATER を 1 にします。MCP サーバーはリポジトリ直下の .mcp.json にプロジェクトスコープで定義すると、設定と一緒にチェックインできます。

出典: Development containers

通信制限と権限確認の扱い

外向き通信は、必要なドメインだけに絞れます。ドメインは公式ドキュメントのネットワーク要件のページで確認してください。参考コンテナの init-firewall.sh は、許可した宛先だけに通信を絞ります。コンテナ内のファイアウォールには追加権限が要るため runArgs で NET_ADMIN と NET_RAW を加えていますが、Claude Code 自体には必須ではなく、自社のネットワーク制御に任せる形でも構いません。

コンテナは非 root ユーザーで動くため、無人運用では --dangerously-skip-permissions を渡せます。root で起動すると CLI が拒否するので、remoteUser が非 root か確認します。ただしツール実行前の確認はなくなり、バインドマウントされたワークスペースのファイルは Claude が変更でき、ホストに直接反映されます。通信制限と組み合わせてください。

確認を減らしつつ安全確認を残すなら auto mode があり、分類器が実行前に審査します。このフラグ自体を禁止するには、managed settings で permissions.disableBypassPermissionsMode を "disable" にします。試すなら anthropics/claude-code リポジトリに参考の開発コンテナがあります。動く例として提供されたもので、メンテナンスされるベースイメージではないとされています。

出典: Development containers

よくある質問

再ビルドのたびにサインインし直しになるのはなぜですか。

既定ではコンテナのホームが再ビルドで破棄されるためです。~/.claude に名前付きボリュームをマウントし、CLAUDE_CONFIG_DIR を同じパスにすると、.claude.json もボリューム内に書かれます。GitHub Codespaces でも再ビルドで消えるため、同じ設定が必要です。

出典: Development containers

Dockerfile で managed-settings.json を入れれば、利用者は設定を変えられませんか。

Dockerfile はリポジトリにあり、書き込み権限のある人は手順を変更・削除できます。リポジトリのファイル編集で回避されないルールにしたい場合は、公式ドキュメントはサーバー管理設定か MDM での配布を案内しています。

出典: Development containers

--dangerously-skip-permissions は開発コンテナなら安全に使えますか。

安全とは言えません。悪意あるプロジェクトによるコンテナ内の情報の持ち出しは防げず、ワークスペースの変更はホストに反映されます。信頼できるリポジトリでだけ使い、通信制限と組み合わせます。フラグ自体を禁止する設定もあります。

出典: Development containers

関連する無料ツール

Claude Code 権限設定(settings.json)ジェネレーター: deny / ask / allow のルールを選ぶと、置き場所つきで settings.json を出力します。配る前の設定の下書きに使えます。

参考(執筆時点)

この記事は、上の出典の内容を中小DXラボが要約・再構成したものです。仕様は変わることがあります。社内で使う・配る前に、公式ドキュメントで最新の情報を確認してください。