インフラ・DevOps
OCIイメージをコンテナまたはFirecrackerマイクロVMとして実行可能に
You can now run same OCI images as containers or Firecracker microVMs (github.com)
要約
Pullrunは、同じOCIイメージをコンテナ、FirecrackerマイクロVM、Apple Silicon VM、Kubernetesワークロード、AIエージェントタスクなど、多様な実行ターゲットで動作させる新しいツールです。デーモン不要で、コンテンツアドレス指定のDAGストアとP2Pイメージ配布により、インフラストラクチャの複雑さを解消し、ストレージの効率化とセキュリティ向上を実現します。
全文翻訳
Pullrun One OCIイメージ。あらゆる実行ターゲット。CLI + ランタイムは25MB未満。同じOCIイメージをコンテナ、FirecrackerマイクロVM、Apple Silicon VM、Kubernetesワークロード、またはAIエージェントタスクとして実行します。デーモン不要。オーバーレイFS不要。個別のVMイメージ不要。
⚡ 30秒インストール • 🚀 クイックスタート • 🏗️ アーキテクチャ • 🎯 Pullrunを選ぶ理由 • 🗺️ 機能マップ • ☸️ Kubernetes • 🤖 AIエージェント
⚡ Pullrunとは?
Pullrunは、同じOCIイメージをコンテナまたはVMとして実行します。レイヤーをコンテンツアドレス指定のDAG(オーバーレイFSなし)に格納し、ブロックをピアツーピアで同期し、約14MBのCLIと約6MBのランタイムデーモンとして提供します。
これが重要な理由:
現代のインフラストラクチャは、開発用のDocker、本番用のcontainerd、分離用のFirecracker、Kubernetes用のCRI、AI用のMCPエージェントなど、多くの実行エンジンを使用しています。これらはすべて同じOCIイメージを実行しているにもかかわらず、それぞれ独自のイメージフォーマット、ストレージ、運用モデルを持っています。Pullrunはこれらのレイヤーを1つのランタイムに統合します。
主な差別化要因:
同じイメージからのコンテナとVM — 個別のVMビルドステップやVMイメージフォーマットは不要
コンテンツアドレス指定のDAGストア — ゼロコピーmmap読み取り、コンテンツハッシュによる重複排除、すべてのノードでバイト単位で同一
P2Pイメージ配布 — クラスタあたり1回のレジストリプル、残りはLAN速度でのピアツーピア同期
約14MBのCLI + 約6MBのランタイムデーモン(ストリップ済み) — デフォルトではデーモン不要(CLIのみのpullrun run)、バックグラウンドサービスにはオプションのデーモン
また、Kubernetes CRIシム(ベータ版)、Docker Composeサポート、AIエージェント用のMCPサーバー、ポリシーエンジン(Cosign、SBOM、seccomp)、P2P同期レイヤー、AES-256-GCM暗号化されたシークレット — これらすべてが同じバイナリに含まれています。
# Apple Silicon VM(macOSデフォルト) — 3秒
pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun" --attach -t
# FirecrackerマイクロVM(Linux) — 400ミリ秒
pullrun run alpine:3.18 --backend vm --cmd "echo" --cmd "hello pullrun" --attach -t
# コンテナ(Linux) — 400ミリ秒
pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun"
# Windows WSL2 — 同じイメージ、同じコマンド、同じストア
pullrun.exe run alpine:3.18 --cmd "echo" --cmd "hello pullrun"
📦 インストール
# 1つのコマンド、あらゆるプラットフォーム
curl -fsSL https://github.com/pullrun/pullrun/raw/main/install.sh | bash
プラットフォーム
macOS
brew tap pullrun/tap && brew install pullrun → ネイティブバイナリ、Xcode不要
Linux
APTパッケージまたは直接ダウンロード、systemdサービス(コンテナにはrunc、VMには/dev/kvmが必要)
Windows
pullrun.exe + WSL2自動プロビジョニング、runc + Firecracker
手動インストールオプション
# macOS(Homebrew — 事前ビルド済み、ビルド依存なし)
brew tap pullrun/tap && brew install pullrun
# ソースから
make build && export PATH="$PWD/bin:$PATH"
# クロスコンパイル
Windows CLI
cd cli/pullrun && GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o pullrun.exe .
🚀 クイックスタート
# ── 任意のOCIイメージをプル ──────────────────────────────────────────
pullrun pull alpine:3.18 # 968ミリ秒 — ベンチマークスクリプトはhack/bench.shにあります
# ── コンテナとして実行(Linux) ─────────────────────────────────
pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun"
# ── マイクロVMとして実行(macOS/Linux) ─────────────────────────────
pullrun run alpine:3.18 --backend vm --cmd "echo" --cmd "hello" --attach -t
# ── デタッチ可能なインタラクティブシェル ──────────────────────────────
pullrun run alpine:3.18 --tty --attach --cmd /bin/sh
# Ctrl-P Ctrl-Q → デタッチ(ワークロードは実行を継続)
# pullrun exec <id> -t /bin/sh → 再アタッチ
# ── バックグラウンドワークロード ────────────────────────────────────────
pullrun run alpine:3.18 --cmd /bin/sleep --cmd 3600
# ── ビルド&プッシュ(Dockerデーモン不要) ─────────────────────
pullrun build ./Dockerfile . -t myapp:latest
pullrun build ./Dockerfile . -t myapp:latest --platform linux/amd64,linux/arm64
pullrun push <root-digest> ghcr.io/myorg/myimg:latest
# ── エアクールド環境用のエクスポート/インポート ───────────────────────────────
pullrun save <digest> -o myimage.tar
pullrun load -i myimage.tar
# ── Compose(別バイナリ) ────────────────────────────────
pullrun-compose up -f myapp/compose.yml # コンテナ(Linuxでデフォルト)
pullrun-compose up -f myapp/compose.yml --backend vm # 同じコンポーズ、VM分離
pullrun-compose logs -f
pullrun-compose down
# ── ライフサイクル ──────────────────────────────────────────────────
pullrun list # すべてのワークロード(保留中/実行中/終了)
pullrun stop <id>
pullrun exec <id> /bin/echo hello
# デタッチされたワークロードに再アタッチ(新しいPTYを割り当て)
pullrun exec <id> -t -- /bin/sh
# または、新しいシェルなしで双方向I/Oストリーミングの場合:
pullrun workload run <id>
# ── イメージ管理 ──────────────────────────────────────────
pullrun images # ローカルDAGストアでプルされたイメージをリスト
pullrun rmi alpine:3.18 # イメージを削除、到達不能なレイヤーをカスケード削除
pullrun rmi sha256:abc... # ダイジェストでも機能します
# ── GC(DAGストアガベージコレクション) ─────────────────────────
pullrun gc # ドライラン — 削除されるものをレポート
pullrun gc --apply # 実際に到達不能なノードを削除
pullrun gc --apply --force # 90%の安全ガードをバイパス
# ── イベント&統計 ─────────────────────────────────────────────
pullrun events --types=WORKLOAD_STARTED,POLICY_DENIED
pullrun stats <id>
# ── ネットワーク ────────────────────────────────────────────
pullrun network create my-net --subnet 10.43.1.0/24
pullrun run alpine:3.18 --net bridge
# ── シークレット ────────────────────────────────────────────
pullrun secret create db_password - # 標準入力から
pullrun run myapp:latest --secret db_password
# ── 設定 ────────────────────────────────────────────────────
pullrun config create nginx.conf ./nginx.conf # ファイルから
pullrun config create nginx.conf - # 標準入力から
pullrun run nginx:latest --config nginx.conf
# ── Diff & Inspect ─────────────────────────────────────────────
pullrun diff <id>
pullrun inspect <id>
pullrun commit <id> myapp:snapshot
# ── ログイン ──────────────────────────────────────────────────────
pullrun login ghcr.io
pullrun logout
# ── MCP(AIエージェント) ────────────────────────────────────────────
pullrun mcp # stdioモード(opencode、Claude Code用)
pullrun mcp --sse :8080 # SSEモード(リモートエージェント用)
# ── P2P同期 ───────────────────────────────────────────────────
pullrun-runtime daemon --sync-addr 0.0.0.0:9500
🎯 Pullrunを選ぶ理由
🏗️ アーキテクチャがすべて
DockerのオーバーレイFSストアはファイルシステムオーバーレイです — オーバーレイFSの脆弱性(CVE-2023-0386、CVE-2023-32629)により、コンテナがホストにエスケープする可能性があります。Pullrunのコンテンツアドレス指定DAGストアはレイヤーをそのまま格納し、コンテンツハッシュで検証します。オーバーレイFSはなく、エスケープもありません。
Pullrunは、ストレージバックエンドに関係なく、すべてのコンテナに影響する共有カーネルのクロスコンテナリスク(例: カーネルページキャッシュのバグであるCVE-2026-31431("Copy Fail"))も軽減します。FirecrackerやApple VirtualizationのようなVMごとのカーネル分離は、これらを完全に封じ込めます。DAGストアにより、VMパスはゼロコストになります:同じイメージ、個別のVMビルドステップなし。
Pullrunはデフォルトでルートレスでも動作します — sudo不要、TCPソケットでリッスンするデーモン不要、中央のdockerdからの攻撃対象領域がありません。
🔥 同じイメージからコンテナとVMを提供する唯一のランタイム
バックエンド
分離
Pullrun
Docker
Podman
Linuxコンテナ(runc)
プロセス
✅
✅
✅
FirecrackerマイクロVMs
VMごとのカーネル
✅
❌
❌
Apple Silicon VMs
VMごとのカーネル
✅
❌
❌
Windows WSL2コンテナ
プロセス
✅
✅
❌
Windows Firecracker VMs
VMごとのカーネル
✅
❌
❌
同じイメージ、あらゆる分離レベル。個別のVMイメージビルドステップなし。OCIマニフェストがVMルートFSです。
🧬 コンテンツアドレス指定DAGストア
Pullrunのストアはrkyv + mmap上に構築されています。OCIレイヤーは一度だけ格納され、コンテンツハッシュによって重複排除され、直接mmap()されます — tar展開不要、オーバーレイFS不要、データを所有するdockerdプロセス不要。sha256: ダイジェストはグローバルに一貫しています。alpine:3.18をプルしたすべてのノードは、ディスク上にバイト単位で同一のファイルを格納します。これにより、P2P同期が容易になります:ブロックはコンテンツハッシュで検証され、差分のみが転送され、クラスタ全体で重複排除されます。
📊 数字で見る
メトリック
Pullrun
Docker
最初のalpine:3.18プル
968ミリ秒
約2秒
コンテナ実行レイテンシ
約400ミリ秒
約800ミリ秒
Apple Virt VM起動
160ミリ秒
該当なし
Firecracker VMコールド