はじめに
Claude Codeの --dangerously-skip-permissions(通称YOLOモード)は、許可プロンプトをすべてスキップして自律的にタスクを実行させる強力なオプションです。しかし、ローカル環境でそのまま使うのはリスクが高い。意図しないファイル削除やプロンプトインジェクションによる被害がホストマシン全体に及ぶ可能性があるためです。
この記事では、Dockerコンテナ内でClaude Codeを動かすことで、YOLOモードを安全に活用する環境を構築する手順を紹介します。
前提環境
- Windows + WSL(Ubuntu)
- Docker Desktop インストール済み
- Claude Code のサブスクリプション(Pro / Max)
Docker DesktopのWSL連携を有効にする
Docker Desktopをインストールしただけでは、WSLの中から docker コマンドが使えないことがあります。以下を確認してください。
- Windows側で Docker Desktop を開く
- Settings → Resources → WSL Integration を開く
- 「Enable integration with my default WSL distro」を ON
- 使用中のUbuntuディストロのトグルも ON
- Apply & restart
ターミナルを開き直して、以下で確認します。
docker --version
バージョンが表示されればOKです。
Dockerイメージを作る
毎回 Claude Code をインストールする手間を省くため、専用のDockerイメージを作ります。
mkdir ~/claude-docker && cd ~/claude-docker
Dockerfile を作成します。
cat << 'EOF' > Dockerfile
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl git nodejs npm python3 python3-pip
USER ubuntu
RUN curl -fsSL https://claude.ai/install.sh | bash
ENV PATH="/home/ubuntu/.local/bin:$PATH"
EOF
Dockerfileのポイント
非rootユーザーで実行する — --dangerously-skip-permissions はroot権限での実行を拒否するため、非rootユーザーが必須です。ubuntu:24.04 イメージにはUID 1000の ubuntu ユーザーが最初から存在するため、そのまま利用しています。ホスト側のUIDが1000以外の場合は id -u で確認し、useradd で適切なUIDのユーザーを作成してください。UID が一致していないと、マウントしたファイルの読み書きで権限エラーが発生します。
ネイティブインストーラーを使う — npm経由(npm install -g @anthropic-ai/claude-code)のインストールは非推奨(deprecated)になっています。curl -fsSL https://claude.ai/install.sh | bash が現在の推奨方法です。
Node.js / Python を入れておく — Claude Code自体はネイティブバイナリなのでNode.jsは不要ですが、statusline(後述)のカスタムスクリプトがNode.jsで書かれている場合や、Claude Codeにコード実行させるプロジェクトでは必要になります。Python も同様に、開発タスクで使う場面が多いため入れておくと便利です。
ビルドします。
docker build --no-cache -t claude-dev .
動作確認。
docker run -it --rm claude-dev claude --version
バージョンが表示されれば成功です。
認証情報を永続化する
Claude CodeのOAuth認証情報は以下の 2箇所 に保存されます。
| ファイル | 内容 |
|---|---|
~/.claude/.credentials.json |
OAuthトークン(アクセストークン、リフレッシュトークン) |
~/.claude.json |
オンボーディング状態、セッション設定 |
コンテナは起動のたびに初期化されるため、この2つをホスト側からマウントしないと 毎回ログインを求められます。特に ~/.claude.json(.claude ディレクトリの外にある別ファイル)を忘れがちなので注意してください。これがないと、認証トークンが残っていてもオンボーディングフロー(初回セットアップ画面)が毎回走ります。
初回のみ、ホスト側でClaude Codeの認証を済ませておきます。
# ホスト側(WSL)で実行
curl -fsSL https://claude.ai/install.sh | bash
source ~/.bashrc
claude auth login
ブラウザが開くのでOAuth認証を完了させてください。
コンテナを起動する
プロジェクトディレクトリに移動して、以下のコマンドで起動します。
docker run -it --rm \
-v $(pwd):/workspace \
-v ~/.claude:/home/ubuntu/.claude \
-v ~/.claude.json:/home/ubuntu/.claude.json \
-w /workspace \
claude-dev \
claude --dangerously-skip-permissions
コンテナの分離について
Dockerは 明示的にマウントしたものだけ がホストと共有されます。このコマンドで共有されるのは以下の3つだけです。
| コンテナ内のパス | ホスト側 | 用途 |
|---|---|---|
/workspace |
カレントディレクトリ | プロジェクトファイル |
/home/ubuntu/.claude |
~/.claude |
認証情報・設定 |
/home/ubuntu/.claude.json |
~/.claude.json |
オンボーディング状態 |
ホスト側の他のプロジェクトやホームディレクトリの他のファイルにはアクセスできません。仮にClaude Codeが rm -rf / を実行したとしても、被害はマウントしたディレクトリに限定されます。
カスタム設定もそのまま引き継がれる
~/.claude ディレクトリをまるごとマウントしているため、ホスト側で行ったカスタム設定はコンテナ内でもそのまま反映されます。
例えば、statusline(ステータスライン)の設定もその一つです。~/.claude/settings.json に以下のような設定をしている場合:
{
"statusLine": {
"type": "command",
"command": "node ~/.claude/statusline.js"
}
}
対応する ~/.claude/statusline.js と合わせて、コンテナ内でもそのまま動作します。
ただし注意点が一つあります。 statuslineのスクリプトが node コマンドで実行される場合、コンテナ内にNode.jsがインストールされている必要があります。本記事のDockerfileでは nodejs を含めていますが、もしNode.jsを省いたイメージを使っている場合はstatuslineが表示されません。スクリプトが何に依存しているかに応じて、必要なランタイムをDockerfileに含めてください。
同様に、~/.claude/settings.json 内の他の設定(パーミッションルール、カスタムコマンドなど)や、~/.claude/skills/ に配置したスキルファイルもそのまま使えます。
エイリアスを登録する
毎回長いコマンドを打つのは面倒なので、エイリアスを設定します。
echo "alias ccd='docker run -it --rm -v \$(pwd):/workspace -v ~/.claude:/home/ubuntu/.claude -v ~/.claude.json:/home/ubuntu/.claude.json -w /workspace claude-dev claude --dangerously-skip-permissions'" >> ~/.bashrc
source ~/.bashrc
注意:
ccはLinuxのCコンパイラ(gcc)のエイリアスとして存在するため、ccd(Claude Code Docker)としています。
以降は、プロジェクトディレクトリで ccd と打つだけで起動できます。
cd ~/dev/your-project
ccd
Claude Codeのバージョン更新について
Claude Codeは起動時に自動アップデートが走るため、Dockerイメージの再ビルドは基本的に不要です。ベースイメージ(Ubuntu)の更新やDockerfileの内容を変更した場合のみ docker build --no-cache -t claude-dev . を実行してください。
構築中に遭遇したハマりポイント
実際に環境を構築する中で遭遇した問題とその原因をまとめます。
WSLで docker コマンドが見つからない
Docker Desktopをインストールしただけでは、WSL内から使えません。Docker Desktopの Settings → Resources → WSL Integration で対象ディストロを有効にする必要があります。
--dangerously-skip-permissions cannot be used with root/sudo privileges
Dockerコンテナはデフォルトでrootユーザーとして実行されます。Claude Codeはセキュリティ上、rootでのYOLOモード実行を拒否するため、Dockerfileで USER を指定して非rootユーザーに切り替える必要があります。
マウントしたファイルに権限エラーが出る
ホスト側のファイル所有者のUIDとコンテナ内ユーザーのUIDが一致しないと、~/.claude/.credentials.json などのファイルが読めません。WSLのデフォルトユーザーは通常UID 1000なので、コンテナ内のユーザーもUID 1000にすることで解決します。
useradd: UID 1000 is not unique
ubuntu:24.04 イメージにはUID 1000の ubuntu ユーザーが既に存在します。新たに useradd -u 1000 する必要はなく、既存の ubuntu ユーザーをそのまま使えます。
毎回ログイン認証を求められる
~/.claude/ だけでなく、~/.claude.json(ディレクトリの外にある別ファイル)もマウントする必要があります。このファイルにオンボーディング状態が保存されており、なければ毎回初回セットアップが走ります。
statuslineが表示されない
statuslineのスクリプトが node コマンドに依存している場合、コンテナ内にNode.jsが必要です。Dockerfileに nodejs パッケージを含めることで解決します。
まとめ
| 項目 | 内容 |
|---|---|
| 分離レベル | プロジェクトディレクトリのみ共有、他は隔離 |
| 認証 |
~/.claude と ~/.claude.json の両方をマウントして永続化 |
| カスタム設定 |
~/.claude のマウントでstatusline等もそのまま反映 |
| 開発ツール | Node.js / Python はDockerfileで追加 |
| 起動コマンド |
ccd(エイリアス登録後) |
| バージョン管理 | 自動アップデートに任せる |
Sandboxing機能だけに頼るのはまだ不十分な部分があり(dangerouslyOverrideSandbox のバイパス問題など)、より確実にホスト環境を守りたいならDockerコンテナで隔離するのが現時点でのベストプラクティスです。