您现在可以将相同的 OCI 映像作为容器或 Firecracker 微虚拟机运行
⚡ 30 秒安装 • 🚀 快速开始 • 🏗️ 架构 • 🎯 为什么选择 Pullrun? • 🗺️ 功能图 • ☸️ Kubernetes • 🤖 AI 代理 ⚡ 什么是 Pullrun? Pullrun 将相同的 OCI 映像作为容器或虚拟机运行。它以内容寻址的 DAG 存储层(不使用 overlayfs),以对等方式同步块,并以 ~14 MB 的命令行工具 + ~6 MB 的运行时守护程序提供。为什么这很重要:现代基础设施使用了过多的执行引擎——开发使用 Docker,生产使用 containerd,隔离使用 Firecracker,Kubernetes 使用 CRI,MCP 代理用于 AI。每个都有自己的映像格式、存储和操作模型——尽管它们都运行相同的 OCI 映像。Pullrun 将这些层合并为一个运行时。关键区别:来自同一映像的容器和虚拟机——无需单独的虚拟机构建步骤,无需单独的虚拟机映像格式 内容寻址的 DAG 存储——零拷贝 mmap 读取,通过内容哈希去重,在每个节点之间字节相同 P2P 映像分发——每个集群拉取一个注册表,其余以局域网速度对等同步 ~14 MB 的命令行工具 + ~6 MB 的运行时守护程序(已裁剪)——默认情况下无需守护程序(仅 CLI pullrun run),可选守护程序用于后台服务 还包括:Kubernetes CRI shim(测试版)、Docker Compose 支持、AI 代理的 MCP 服务器、策略引擎(Cosign、SBOM、seccomp)、P2P 同步层和 AES-256-GCM 加密的秘密——所有功能都在同一个二进制文件中。# Apple Silicon 虚拟机(macOS 默认)——3 秒 pullrun run alpine:3.18 --cmd "echo " --cmd "hello pullrun" --attach -t # Firecracker 微虚拟机(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" 📦 安装 # 一条命令,任何平台 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 用于容器,/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 ms — hack/bench.sh 处的基准脚本 # ── 作为容器运行(Linux)────────────────────────────── pullrun run alpine:3.18 --cmd "echo " --cmd "hello pullrun" # ── 作为微虚拟机运行(macOS/Linux)──────────────────── pullrun run alpine:3.18 --backend vm --cmd "echo " --cmd "hello" --attach -t # ── 交互式 shell 并分离 ────────────────────────────── 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 # 相同的 Compose,虚拟机隔离 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 流的重新附加而不使用新的 shell: pullrun workload run <id> # ── 映像管理 ─────────────────────────────────────────── pullrun images # 列出本地 DAG 存储中的已拉取映像 pullrun rmi alpine:3.18 # 删除映像,级联删除不可达层 pullrun rmi sha256:abc... # 也可以通过摘要进行操作 # ── 垃圾回收(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 # ─
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡