容器化
Pi 默认以全部权限运行,但在某些情况下,你可能希望更精确地控制 Pi 可以写入哪些目录以及拥有哪些访问权限。
有两种通用方案。你可以:
- 在隔离环境中运行整个
pi进程,或 - 在主机上运行
pi,并将工具执行路由到隔离环境中。
| 模式 | 隔离内容 | 适用场景 | 说明 |
|---|---|---|---|
| Gondolin 扩展 | 内置工具和 ! 命令 | 在主机保留认证的同时进行本地微 VM 隔离 | 参见 examples/extensions/gondolin/。 |
| 纯 Docker | 本地容器中的整个 pi 进程 | 简单的本地隔离 | Provider API 密钥会进入容器。 |
| OpenShell | 策略控制沙箱中的整个 pi 进程 | 本地或远程托管沙箱 | 需要 OpenShell 网关 |
扩展在 pi 进程运行的位置执行。如果你使用工具路由扩展在主机上运行 pi,其他自定义扩展工具仍在主机上运行,除非它们也委托其操作。
Gondolin
Section titled “Gondolin”Gondolin 是一个本地 Linux 微 VM。
当你希望 pi 在主机上运行但所有内置工具路由到 VM 时,使用示例扩展。
设置:
cp -R packages/coding-agent/examples/extensions/gondolin ~/.pi/agent/extensions/gondolincd ~/.pi/agent/extensions/gondolinnpm install --ignore-scripts从要挂载的项目运行:
cd /path/to/projectpi -e ~/.pi/agent/extensions/gondolin该扩展将主机 cwd 挂载到 VM 中的 /workspace,并覆盖 read、write、edit、bash、grep、find 和 ls。
用户 ! 命令也会路由到 VM 中。
/workspace 下的文件更改会写回主机。
要求:Node.js >= 23.6.0(用于 @earendil-works/gondolin),以及 QEMU(需通过包管理器安装)。
纯 Docker
Section titled “纯 Docker”当你需要最简单的本地容器边界时,在 Docker 中运行整个 pi 进程。
Dockerfile.pi:
FROM node:24-bookworm-slim
RUN apt-get update \ && apt-get install -y --no-install-recommends bash ca-certificates git ripgrep \ && rm -rf /var/lib/apt/lists/*RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent
WORKDIR /workspaceENTRYPOINT ["pi"]构建并运行:
docker build -t pi-sandbox -f Dockerfile.pi .
docker run --rm -it \ -e ANTHROPIC_API_KEY \ -v "$PWD:/workspace" \ -v pi-agent-home:/root/.pi/agent \ pi-sandbox-v "$PWD:/workspace" 将当前目录挂载到容器中的 /workspace,使得 Docker 内 /workspace 的读写会直接影响主机文件,与 Gondolin 示例类似。
若需要容器本地的设置和会话,请为 /root/.pi/agent 使用命名卷。挂载主机 ~/.pi/agent 会将主机认证和会话文件暴露给容器。
OpenShell
Section titled “OpenShell”当你需要具有文件系统、进程、网络、凭证和推理控制的策略沙箱时,使用 NVIDIA OpenShell。 OpenShell 可通过由 Docker、Podman 或 VM 运行时支持的本地网关,或通过远程 Kubernetes 网关运行沙箱。
每个沙箱都需要一个活跃的网关。 在创建沙箱之前注册并选择一个:
openshell gateway add <gateway-url> --name <name>openshell gateway select <name>在 OpenShell 沙箱内启动 pi:
openshell sandbox create --name pi-sandbox --from pi -- pi在此模式下,整个 pi 进程在沙箱内运行。
内置工具、! 命令和扩展工具都在 OpenShell 边界内执行。
如果网关是远程的,项目文件不会从主机 bind-mount,意味着沙箱中的写入不会反映到你的机器上。 在沙箱内克隆仓库或使用 OpenShell 文件传输命令:
openshell sandbox upload pi-sandbox ./repo /workspaceopenshell sandbox download pi-sandbox /workspace/repo ./repo-outOpenShell provider 可以将原始模型 API 密钥保留在沙箱外。
配置推理路由后,沙箱内的代码可以调用 https://inference.local,网关会在上游注入配置的 provider 凭证。
若希望模型流量走此路由,请将 Pi 配置为使用相应的 OpenAI 兼容或 Anthropic 兼容端点。