podman rootless でコンテナ実行で保険かけつつ claude code を定額働かせ放題したいメモ
背景
claude code --dangerously-skip-permission で定額働かせ放題して, 寝て起きたらコードができているとかやりたい.
でも rm ~/ とかあったり, API key を github に勝手にアップとか(gh を設定しているとき)あるっぽいので, サンドボックス環境で動かしたい(claude code クンに 36 協定無視して定額働かせ放題してもらうのだから, AI に労災保険を掛けるのは経営者の義務!)
Docker はなんかデーモン起動しないなどで壊れていて動かんとか, WSL2 でうまく動かんとか, 有料化でめんどいとかで使えない or 使いたくないとか.
Claude code, まだ出始めだからか, ChatGPT くんにきいてもあんまりいい答えでてこん...
頑張って手動で調べた!
Podman rootless でやります! とりあえずはファイルシステムを隔離する程度で...
ホスト側は Linux(Ubuntu)とします.
podman
インストールは特に問題ないと思います.
ubuntu だと apt で入ります.
/etc/subuid あたりが設定してあるのを確認しましょう.
コンテナ内を一般ユーザーで動かす
root アカウントでもいいかもはしれませんが, claude code でコンテナ内でなんかシステムファイルを書き換えたりして挙動が変になるのを防ぐ可能性も見越して, 一般ユーザーで動かすことにします.
podman は, デフォルトではホスト側のユーザー(e.g. syoyo uid=1000)を, コンテナ内では root(uid=0)にマッピングします.
(その他, 不明ユーザーは root になる)
したがって -v $HOME/.claude:/home/ubuntu/.claude などとすると,
.claude/.credential.json(ホスト側では permission 600)は, コンテナ内では root の 600 になっていまい, コンテナ内の一般ユーザーでは読み取ることができません
-rw------- 1 root root 364 Aug 5 11:55 .credentials.json
drwxrwxr-x 11 root root 4.0K Aug 4 16:52 projects
-rw-rw-r-- 1 root root 161 Aug 4 00:08 settings.json
-rw-rw-r-- 1 root root 106 Jul 27 17:11 settings.local.json
drwxrwxr-x 2 root root 4.0K Aug 5 20:06 shell-snapshots
drwxrwxr-x 2 root root 4.0K Aug 5 19:13 statsig
drwxrwxr-x 2 root root 4.0K Aug 5 19:20 todos
幸いなことに, --userns=keep-id(ver 3.2 あたりから使えるっぽい) でホスト側のユーザidをコンテナ内のユーザidと同じにすることができます.
drwxrwxr-x 6 ubuntu ubuntu 4096 Aug 5 20:03 .
drwxr-x--- 1 ubuntu ubuntu 4096 Aug 5 13:57 ..
-rw------- 1 ubuntu ubuntu 364 Aug 5 11:55 .credentials.json
drwxrwxr-x 11 ubuntu ubuntu 4096 Aug 4 16:52 projects
-rw-rw-r-- 1 ubuntu ubuntu 161 Aug 4 00:08 settings.json
-rw-rw-r-- 1 ubuntu ubuntu 106 Jul 27 17:11 settings.local.json
drwxrwxr-x 2 ubuntu ubuntu 4096 Aug 5 20:06 shell-snapshots
drwxrwxr-x 2 ubuntu ubuntu 4096 Aug 5 19:13 statsig
drwxrwxr-x 2 ubuntu ubuntu 4096 Aug 5 19:20 todos
voila~
uid 問題
コンテナ内でホスト側と同じ uid のユーザーがいないとうまくいかないです.
(e.g. ホスト側 1001, コンテナ内 1000 など. podman 4.x くらいから uid の詳細マッピング指定が使えるようだが...?)
とりあえずは Dockerfile で uid 指定でコンテナ内のユーザー作るようにイメージ作り直しでしょうか.
claude code 用イメージの作成
serena mcp 利用なども考えて, uv(python env manager) と nodejs 入れます!
68才主ふの私は主に C++ と JavaScript を扱うので, こんな感じになりました.
FROM makeappdev/cpp-dev:24.04
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install -y --no-install-recommends curl ca-certificates
RUN apt-get install -y ninja-build nodejs npm
# Download the latest installer
ADD https://astral.sh/uv/install.sh /uv-installer.sh
# Run the installer then remove it
RUN sh /uv-installer.sh && rm /uv-installer.sh
# uid/gid 1000
USER ubuntu
WORKDIR /home/ubuntu/workspace
# Configure npm global directory and install Claude Code
RUN npm config set prefix '/home/ubuntu/.npm-global' && \
npm install -g @anthropic-ai/claude-code
# Add npm global bin to PATH
ENV PATH="/home/ubuntu/.npm-global/bin:$PATH"
# Ensure the installed binary is on the `PATH`
ENV PATH="/home/ubuntu/.local/bin/:$PATH"
RUN claude mcp add serena -- uvx --from git+https://github.com/oraios/serena serena-mcp-server --context ide-assistant --project /workspace
$ podman build -t tinyusdz .
などとしてイメージ作っておきます(Docker の場合と同じ)
makeappdev/cpp-dev では uid 1000 がユーザー ubuntu になっています.
claude code を動かす.
claude code を(再設定せずに)動かすには, ~/.claude フォルダ(特に ~/.claude/.credentials.json)と ~/.claude.json が必要です.
(~/.claude.json が無いと, ~/.claude/.credentials.json は読まれずに再度登録が必要)
volume mount(mapping)でこれらフォルダとファイルを指定して共有するようにします.
(コンテナ内で書き換えされるので, 必要に応じてホスト側ではバックアップして)
あとは開発する repo も mapping して.
$ podman run --rm --userns=keep-id \
-v <your_repo>:/home/ubuntu/workspace \
-v $HOME/.claude.json:/home/ubuntu/.claude.json \
-v $HOME/.claude:/home/ubuntu/.claude \
-it tinyusdz claude
then,
╭───────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code! │
│ │
│ /help for help, /status for your current setup │
│ │
│ cwd: /home/ubuntu/workspace │
╰───────────────────────────────────────────────────╯
voila~
あと -v の位置とか --userns の位置とか結構シビアっぽい(-it より前に指定しないとダメっぽい)
repo のパスがホスト側とコンテナ内と変わってしまうので, .claude.json のセッション履歴は共有は難しいカモ
さらなる高みへ
chroot ではダメなのか?
ファイルシステム隔離で十分であれば, ホスト OS が Linux であれば chroot でもいいと思います...
あとは lxc(?) とか?
deny リスト
ファイルシステム隔離でとりあえずは rm -rf ~/ などは防げるでしょう.
ただ credentials を github repo にアップされるなどのリスクはまだありますので, deny リストを適宜追加するか, container でネットワークに制限を与えるなどで対策でしょうか.
詳細は ChatGPT くんなりにきいてみて.
ccmanager との連携
TODO.
とりあえずは worktree を host 側で作成しておくでしょうか.
Opus 4 制限ありすぎ
Opus 4 ですが, 2025/08/05 時点では Max $100 plan(5x) では 20 分くらいしか使えません.
(画像あたえるなどでトークン量増えるともっと短い). $200 20x でも 1~2 時間が限界と思います.
8 月下旬からさらに制約が出ます. 長時間動かすには Sonnet4 使うしかないでしょう
Discussion