この記事で分かること
- Claude Code × devcontainer の新規プロジェクト立ち上げを1コマンドで自動化するCLI「spinup」の紹介
- ファイアウォール(ホワイトリスト方式)による安全なエージェント実行環境の設計
- 「作り始めるまでのコスト」をゼロに近づけることで、アイデアの検証スピードを上げるという考え方
"作り始めるまで"が意外と長い問題
AIエージェントの発展によって、
「どう作るか」よりも「何を / なぜ作るか」に重心がシフトしてきています。
であれば、いかにたくさんのアイデアをいかに早く形にして検証するかが勝ち筋になるはずです。
もちろん価値検証の「数」をこなせば良いという話ではありませんが、早く動くアプリケーションを作るという圧力が今後はもっと増していきそうです。
ところが、思いついたアイデアを形にしようとするたびに、こんな作業をしていました。
-
gh auth loginで GitHub にログイン - GitHub 上でリポジトリを作成
- devcontainer に必要なファイルを claude-code/.devcontainer からダウンロード
- リポジトリにコピー
簡単な作業です。でもこの「簡単だけど毎回やる」が意外と曲者で、
気づけばめんどくさくなって、なんでもかんでも1つのリポジトリに詰め込み、あとで頑張って切り出す——という悪循環に陥っていました。
「新しいリポジトリを作るコスト」がわずかでもあると、人はそれを避けます。
結果として、検証すべきアイデアの数が減ります。
だから、この摩擦をゼロにしたいと思いました。
--dangerously-skip-permissions の話
ところで、Claude Code を使うときに毎回実行確認されるのがめんどくさいので、
普段は devcontainerを使い隔離されたコンテナの環境にて --dangerously-skip-permissions オプションを使っています。
claude --dangerously-skip-permissions
ただし、Claude Code Docs にも記載がある通り、コンテナで隔離されているからといってセキュリティ上安全とは限りません。
特に環境変数や API キーなど、コンテナ内の情報が外部に流出するリスクがあります。
ファイアウォールのようなネットワーク制御が必要です。この話は後ほど詳しく書きます。
spinup でどう解決したか
spinup は対話形式で数問に答えるだけでプロジェクトの雛形が完成するシェルスクリプトです。
実行コマンドは一つで以下を実行するだけです。
sh spinup.sh
実行すると、こんな流れで進みます。
$ sh spinup.sh
Repository name:
sample-repository
Select runtime:
1) go
2) java
3) node
4) python
5) rust
Enter number: 3
Select node version (default: 22):
1) 20
2) 22
Enter number: 2
Visibility [private/public] (default: private):
public
Description (optional, Enter to skip):
サンプルリポジトリ
Clone path (default: /Users/matsuojumpei/Projects):
/Users/matsuojumpei
=== Summary ===
Repository: sample-repository
Runtime: node 22
Visibility: public
Clone path: /Users/matsuojumpei/sample-repository
Description: サンプルリポジトリ
Proceed? [y/N] y
「y」を押すと、リポジトリ作成 → clone → devcontainer セットアップ → 初期コミット → push まで一気に完了します。
すべてのオプションはコマンドライン引数でも渡せるので、慣れたらワンライナーで実行できます。
./spinup.sh -n my-app -r node -v 22
アイデアを思いついてから「コードを書き始められる状態」まで、数十秒です。
こだわったポイント
ファイアウォール(ホワイトリスト方式)
Claude Code はエージェントとしてコードを書いたりコマンドを実行したりします。つまり、コンテナ内からインターネットに自由にアクセスできる状態は、環境変数やAPIキーの流出リスクがあります。
spinup で生成される devcontainer では、iptables と ipset を使ったホワイトリスト方式のファイアウォールを組み込んでいます。
許可するのは以下のドメインだけです。
| カテゴリ | 許可ドメイン例 |
|---|---|
| Claude Code 本体 |
api.anthropic.com など |
| VS Code |
marketplace.visualstudio.com など |
| GitHub | API から取得した IP レンジ |
| パッケージレジストリ | ランタイムに応じて自動追加(npm, PyPI, crates.io など) |
デフォルトポリシーは DROP。許可リスト以外への通信はすべてブロックされます。
コンテナ起動時にスクリプトが走り、example.com にアクセスできないこと(ブロック確認)と api.github.com にアクセスできること(許可確認)を自動検証しています。何がブロックされているか明確に分かっている、という安心感があります。
CLAUDEの設定ファイルについて
Claude Code のユーザー設定(エージェント、スキルなど)は ~/.claude/ に保存されます。
spinup で生成される devcontainer は、ホストの ~/.claude/agents と ~/.claude/skills をバインドマウントしています。
"mounts": [
"source=${localEnv:HOME}/.claude/agents,target=/home/node/.claude/agents,type=bind",
"source=${localEnv:HOME}/.claude/skills,target=/home/node/.claude/skills,type=bind"
]
したがって自分が作ったエージェントやスキルは、どのプロジェクトでも自動的に使えます。新しいプロジェクトを作るたびに設定をコピーする必要はありません。
一方、プロジェクト固有の設定(CLAUDE.md)はプロジェクトごとに異なるべきなので、devcontainer 起動後に claude /init で生成してください。
~/.claude/ には他にも memory(セッション横断の自動メモリ)や settings.json(権限ルール)などがありますが、これらもマウントすべきかは迷いました。マウントすれば過去の学習が引き継がれる一方、プロジェクトごとにクリーンに始めたい場合もあります。ここは使い込みながら判断していくつもりです。
テンプレートの拡張性
spinup は templates/ ディレクトリの規約に従ってランタイムを自動検出します。
新しいランタイム(例えば Zig)を追加したければ、以下のファイルを置くだけです。
| ファイル | 必須 |
|---|---|
dockerfiles/Dockerfile.zig |
必須 |
devcontainer/devcontainer.zig.json |
必須 |
runtime.conf/zig.conf |
必須 |
firewall-domains/zig.txt |
任意 |
gitignore/zig.gitignore |
任意 |
スクリプト本体を一切変更せずに、選択メニューに「zig」が自動で追加されます。
使い方
前提条件
- macOS
-
GitHub CLI (
gh) がインストール・認証済み - Claude Code サブスクリプション(Max / Team / Enterprise)
インストール
git clone https://github.com/peintangos/spinup.git
PATH に追加しておくとどこからでも実行できます。
export PATH="/path/to/spinup:$PATH"
対応ランタイム
| ランタイム | ベースイメージ | デフォルトバージョン |
|---|---|---|
| Node.js | node:<ver> |
22 |
| Python | python:<ver> |
3.12 |
| Go | golang:<ver> |
1.23 |
| Java | eclipse-temurin:<ver>-jdk |
21 |
| Rust | rust:<ver> |
1.84 |
まとめ
「リポジトリ作って devcontainer 用意して……」という作業は、1回1回は大したことがありません。でもその小さな摩擦が、新しいアイデアを試そうとする気概をすり減らすものです。
spinup でやったことをまとめると:
- 1コマンドでリポジトリ作成から devcontainer セットアップまで完了
- ファイアウォールでホワイトリスト方式のネットワーク制御
-
設定の自動共有で
~/.claude/のエージェント・スキルを使い回し - テンプレート追加だけで新しいランタイムに対応
作り始めるまでの時間を限りなくゼロにして、アイデアを1つでも多く形にしていけたらいいなと思います