1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Mac】Claude Code を Docker Sandbox で bypass-permissions する方法

1
Last updated at Posted at 2026-03-26

Docker Sandbox 上で Claude Code を手軽に bypass-permissions 実行するためのシェル関数群を作ったので共有します。

※WSL 環境の方は「【WSL】Claude Code を Docker コンテナで安全に bypass-permissions する方法」を参照。

TL;DR

.zshrc に以下を追記する。

# ---------- Claude Code Docker Sandbox ----------
get_claude_sandbox_name() {
  basename="$(basename "$(pwd)")"
  echo "claude-$(echo "$basename" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9._-]/-/g')"
}

# Docker Sandbox で Claude Code を起動(GH_TOKEN 自動注入付き)
dsrc() { # Docker-Sandbox Run Claude の略
  local name token
  name="$(get_claude_sandbox_name)"
  token=$(gh auth token 2>/dev/null)
  if [ -n "$token" ]; then
    docker sandbox exec "$name" bash -c "\
      grep -q 'GH_TOKEN' /etc/sandbox-persistent.sh 2>/dev/null || \
        echo 'export GH_TOKEN=$token' >> /etc/sandbox-persistent.sh && \
      gh auth setup-git" 2>/dev/null
  fi
  docker sandbox run claude "$@"
}

# ネットワーク制御
set_sandbox_proxy() {
  local pwd sbx
  pwd="$(pwd -P)"
  sbx="$(docker sandbox ls | awk -v p="$pwd" 'NR>1 && $4==p {print $1; exit}')"
  if [ -z "$sbx" ]; then
    echo "No sandbox matched for workspace: $pwd" >&2
    return 2
  fi
  docker sandbox network proxy "$sbx" "$@"
}
dsnpa() { set_sandbox_proxy --policy allow; }
dsnpd() { set_sandbox_proxy --policy deny; }

# Sandbox コンテナに Bash で入る
dseb() { # Docker-Sandbox Exec Bash の略
  docker sandbox exec -it "$(get_claude_sandbox_name)" bash -c "cd '$(pwd)' && exec bash"
}

dsrc で起動する。

cd ~/my-project
dsrc                     # 起動

ワンコマンドでネットワーク 許可/拒否 を切り替えできる。
(Sandbox起動中に、別シェルから同一ディレクトリで実行する)

cd ~/my-project
dsnpa  # 全ネットワーク許可(npm install, pip install 等)
dsnpd  # 最小限に制限(Claude API など。コーディング中はこちら)

別シェルから Sandbox コンテナに Bash で入れる(テスト実行等に便利)。

cd ~/my-project
dseb                     # コンテナに Bash で入る(例: uv run pytest 等を直接実行)

前提: Docker Desktop for Mac(Sandbox 有効化済み)、GitHub CLI 認証済み


オプション: GitHub 連携の事前準備(ホスト側で実行)

コンテナ内から git pushgh コマンドで GitHub にアクセスしたい場合のみ必要。dsrc がホスト側のトークンをコンテナに自動注入する。

# ホスト側のターミナルで実行
brew install gh          # 未導入の場合
gh auth login            # GitHub 認証
gh auth setup-git        # git の credential helper に登録


仕組み

dsrc 起動時に、ホストの GitHub トークンをコンテナに注入し、プロジェクトディレクトリを bind mount した上で Claude Code を起動する。

本セットアップの特徴

  • GitHub トークン自動注入 — ホスト側の GitHub CLI 認証トークン(gh auth token)をサンドボックスに自動注入し、サンドボックス内からホストと同じ権限で GitHub にアクセスできる
  • ネットワーク制御dsnpa / dsnpd の1コマンドで外部ネットワークの全許可/Claude API のみに切り替えられる
  • ファイル共有 — プロジェクトディレクトリを bind mount するため、ホストとサンドボックスでファイルが共有される
  • プロジェクト単位の分離 — カレントディレクトリ名からサンドボックス名を自動生成(claude-<dir>)するため、プロジェクトごとに独立したサンドボックスになる
  • 状態の永続化 — 2回目以降は既存サンドボックスを再利用し、コンテナ内の状態(インストール済みパッケージ等)が保持される

ネットワークポリシーの詳細

Docker Sandbox はホスト側の MITM プロキシ経由でネットワークを制御する(公式ドキュメント)。

ポリシー コマンド 動作
allow(デフォルト) dsnpa すべての外部ネットワーク接続を許可。プライベート IP(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 等)とクラウドメタデータ(169.254.0.0/16)はブロック
deny dsnpd すべての外部接続をブロック。Claude Code の動作に必要な最小限のドメイン(*.anthropic.com, platform.claude.com:443)のみ許可される

deny ポリシーでは npm installgit push など外部アクセスが必要な操作は失敗する。パッケージインストール時は一時的に dsnpa に切り替え、完了後 dsnpd に戻す運用がおすすめ。

dsnpa / dsnpdSandbox で Claude Code を実行中に、別のターミナルを開いて同じプロジェクトディレクトリで実行する。カレントディレクトリからサンドボックスを自動特定するため、cd してからコマンドを打つだけでよい。

参考: docker sandbox network proxy リファレンス / Docker Sandbox アーキテクチャ

なぜ Sandbox が必要か

Claude Code にコーディング作業を長時間自律的に任せるには --dangerously-skip-permissions が必要になる。しかしホスト環境で直接使うと、意図しないファイル削除やシステム変更のリスクが高い。

Docker Sandbox 内で実行すれば、ディスク・ネットワーク・プロセスがホストから分離され、安全に自律実行できる。

  • ディスク — マウントしたディレクトリ以外はホストから隔離。rm -rf / してもホストは無事
  • ネットワーク — ポリシーを allow / deny でワンコマンド切り替え可能(詳細は後述
  • プロセス — コンテナ内で完結。暴走してもホストに影響しない

マウントしたプロジェクトディレクトリはホストと共有されます(コーディング結果をホスト側で確認するため)。

補足: コンテナ内の初回 Git 設定

コンテナ内に SSH はないため、リモートが SSH の場合は HTTPS に変更が必要。Claude Code に指示すれば自動でやってくれる。

git remote set-url origin https://github.com/<user>/<repo>.git
git config --global user.name "$(gh api user --jq '.login')"
git config --global user.email "$(gh api user --jq '"\(.id)+\(.login)@users.noreply.github.com"')"

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?