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?

【WSL】Claude Code を Docker コンテナで bypass-permissions する方法

1
Posted at

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 あり)

image.png

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

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

前提: Docker Desktop for Windows(WSL 統合有効)


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

コンテナ内から git pushgh コマンドで 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"')"

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?