Docker コンテナ上で Claude Code を手軽に bypass-permissions 実行するためのシェル関数群を作ったので共有します。WSL2 Ubuntu 環境向けです。
※Mac 環境の方は「【Mac】Claude Code を Docker Sandbox で bypass-permissions する方法」を参照。
TL;DR
.bashrc に以下を追記する。
# ---------- Claude Code Docker CLI Sandbox ----------
get_claude_sandbox_name() {
basename="$(basename "$(pwd)")"
echo "claude-$(echo "$basename" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9._-]/-/g')"
}
# Docker CLI で Claude Code を起動(GH_TOKEN 自動注入付き)
dcsrc() { # Docker-CLI Sandbox Run Claude の略
local name token
name="$(get_claude_sandbox_name)"
token=$(gh auth token 2>/dev/null)
docker pull docker/sandbox-templates:claude-code
if ! docker inspect "$name" &>/dev/null; then
docker run -d --name "$name" \
-v "$(pwd):$(pwd)" -w "$(pwd)" \
docker/sandbox-templates:claude-code sleep infinity
fi
docker start "$name" 2>/dev/null
if [ -n "$token" ]; then
docker exec -w / "$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 exec -it -w "$(pwd)" "$name" bash -lc "claude --dangerously-skip-permissions $*"
}
# コンテナに Bash で入る
dcseb() { # Docker-CLI Sandbox Exec Bash の略
docker exec -it "$(get_claude_sandbox_name)" bash -c "cd '$(pwd)' && exec bash"
}
dcsrc で起動する。
cd ~/my-project
dcsrc # 起動(初回はイメージ pull あり)
別シェルからコンテナに Bash で入れる(テスト実行等に便利)。
cd ~/my-project
dcseb # コンテナに Bash で入る(例: uv run pytest 等を直接実行)
前提: Docker Desktop for Windows(WSL 統合有効)
オプション: GitHub 連携の事前準備(ホスト側で実行)
コンテナ内から git push や gh コマンドで GitHub にアクセスしたい場合のみ必要。dcsrc がホスト側のトークンをコンテナに自動注入する。
# ホスト側のターミナルで実行
sudo apt install gh # 未導入の場合(Ubuntu/Debian)
gh auth login # GitHub 認証
gh auth setup-git # git の credential helper に登録
仕組み
dcsrc 起動時に、ホストの GitHub トークンをコンテナに注入し、プロジェクトディレクトリを bind mount した上で Claude Code を起動する。
本セットアップの特徴
-
通常の Docker コンテナを使用 — Windows上のDocker Sandbox ではなく通常の
docker run/docker execで管理するため、WSL 環境でも安定して動作する - ネットワーク制御は未搭載 — Docker Sandbox が提供するワンコマンドのネットワーク遮断機能は利用できない。安定したコンテナ環境を得るためのトレードオフ
-
GitHub トークン自動注入 — ホスト側の GitHub CLI 認証トークン(
gh auth token)をコンテナに自動注入し、コンテナ内からホストと同じ権限で GitHub にアクセスできる - ファイル共有 — プロジェクトディレクトリを bind mount し、ホストと同じ絶対パスでアクセスできる
-
プロジェクト単位の分離 — カレントディレクトリ名からコンテナ名を自動生成(
claude-<dir>)するため、プロジェクトごとに独立したコンテナになる -
状態の永続化 — コンテナは
sleep infinityで常駐するため、2回目以降は既存コンテナを再利用し、インストール済みパッケージ等の状態が保持される
なぜ Sandbox が必要か
Claude Code にコーディング作業を長時間自律的に任せるには --dangerously-skip-permissions が必要になる。しかしホスト環境で直接使うと、意図しないファイル削除やシステム変更のリスクが高い。
Docker コンテナ内で実行すれば、ディスク・ネットワーク・プロセスがホストから分離され、安全に自律実行できる。
-
ディスク — マウントしたディレクトリ以外はホストから隔離。
rm -rf /してもホストは無事 -
ネットワーク — コンテナのブリッジネットワークで分離。ただし Mac 版の
docker sandboxが提供するワンコマンドのネットワークポリシー切り替え(全許可 / Claude API のみ許可)は Docker CLI 方式では利用できない。制限が必要な場合はiptables等で手動設定する - プロセス — コンテナ内で完結。暴走してもホストに影響しない
マウントしたプロジェクトディレクトリはホストと共有されます(コーディング結果をホスト側で確認するため)。
なぜ docker sandbox ではなく Docker CLI を使うのか
WSL では docker sandbox(Docker Desktop の実験的機能)が不安定。Windows 側 exe を経由する通信が長時間セッションで途切れやすく、作業途中の状態が失われる。
そのため通常の docker CLI で同じイメージ(docker/sandbox-templates:claude-code)を管理する dcsrc コマンドを使う。
補足: コンテナ内の初回 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"')"
