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 push や gh コマンドで 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 install や git push など外部アクセスが必要な操作は失敗する。パッケージインストール時は一時的に dsnpa に切り替え、完了後 dsnpd に戻す運用がおすすめ。
dsnpa / dsnpd は Sandbox で 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"')"