8  容器化

8.1 概述

Pi 默认以全部权限运行,但在某些场景下,你可能需要更多控制——比如限制 Pi 可以写入的目录、隔离网络访问或控制 API Key 的暴露。

Pi 的容器化有两种通用方案:

  1. 将整个 Pi 进程放入隔离环境中运行
  2. 在宿主机上运行 Pi,将工具执行路由到隔离环境

8.2 方案选择

方案 隔离内容 最适合 备注
Gondolin 扩展 内置工具和 ! 命令 本地微VM 隔离,认证保留在宿主机 扩展运行在宿主机上
Plain Docker 整个 Pi 进程 简单的本地隔离 Provider API Key 进入容器
OpenShell 整个 Pi 进程 本地或远程托管沙箱 需要 OpenShell 网关
Note

扩展运行在 Pi 进程所在的位置。如果你在宿主机上运行 Pi 并使用工具路由扩展,其他自定义扩展工具仍在宿主机上运行,除非它们也委托了操作。

8.3 Gondolin 微VM 扩展

Gondolin 是一个本地 Linux 微VM。当你想在宿主机上运行 Pi,但将所有内置工具路由到 VM 中执行时,使用此方案。

8.3.1 安装与配置

# 复制示例扩展到 Pi 的扩展目录
cp -R packages/coding-agent/examples/extensions/gondolin ~/.pi/agent/extensions/gondolin
cd ~/.pi/agent/extensions/gondolin
npm install --ignore-scripts

8.3.2 运行

从你要挂载的项目目录启动:

cd /path/to/project
pi -e ~/.pi/agent/extensions/gondolin

8.3.3 工作原理

该扩展将宿主机当前工作目录挂载到 VM 中的 /workspace,并覆盖以下工具:

被覆盖的工具 说明
read 在 VM 中读取文件
write 在 VM 中写入文件
edit 在 VM 中修补文件
bash 在 VM 中执行命令
grep 在 VM 中搜索
find 在 VM 中查找
ls 在 VM 中列目录

用户的 ! 命令也会路由到 VM 中。/workspace 下的文件变更会直接写回宿主机。

8.3.4 系统要求

  • Node.js >= 23.6.0(用于 @earendil-works/gondolin
  • QEMU(通过包管理器安装)
Tip

Gondolin 方案的核心优势是:认证信息(API Key、OAuth 令牌)保留在宿主机上,不会暴露给 VM。只有工作空间文件是共享的。

8.4 Plain Docker

当你需要最简单的本地容器边界时,将整个 Pi 进程放入 Docker 中运行。

8.4.1 Dockerfile

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 /workspace
ENTRYPOINT ["pi"]

8.4.2 构建与运行

# 构建 Docker 镜像
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

8.4.3 挂载说明

挂载 说明
-v "$PWD:/workspace" 将当前目录挂载到容器中,/workspace 中的读写直接影响宿主文件
-v pi-agent-home:/root/.pi/agent 使用命名卷存储容器内的设置和会话
Warning

如果你挂载宿主机的 ~/.pi/agent 到容器中,宿主机的认证和会话文件将暴露给容器。仅在确实需要时这样做。

8.4.4 自定义示例

# 使用不同模型运行
docker run --rm -it \
  -e OPENAI_API_KEY \
  -v "$PWD:/workspace" \
  -v pi-agent-home:/root/.pi/agent \
  pi-sandbox --provider openai --model gpt-4o

# 只读模式审查代码
docker run --rm -it \
  -e ANTHROPIC_API_KEY \
  -v "$PWD:/workspace:ro" \
  pi-sandbox --tools read,grep,find,ls -p "Review the code"
Tip

使用 :ro 标志将工作空间以只读方式挂载,为代码审查提供了额外的安全层。

8.5 OpenShell 策略控制沙箱

使用 NVIDIA OpenShell 当你需要一个策略控制沙箱,具有文件系统、进程、网络、凭证和推理控制能力时。

OpenShell 可以通过以下方式运行沙箱:

  • 本地网关(由 Docker、Podman 或 VM 运行时支持)
  • 远程 Kubernetes 网关

8.5.1 设置网关

每个沙箱需要一个活跃的网关。在创建沙箱前注册并选择一个:

openshell gateway add <gateway-url> --name <name>
openshell gateway select <name>

8.5.2 在沙箱中启动 Pi

openshell sandbox create --name pi-sandbox --from pi -- pi

在这种方案中,整个 Pi 进程在沙箱内运行。内置工具、! 命令和扩展工具都在 OpenShell 边界内执行。

8.5.3 文件传输

如果网关是远程的,项目文件不会从宿主机绑定挂载。在沙箱内克隆仓库或使用 OpenShell 文件传输命令:

# 上传文件到沙箱
openshell sandbox upload pi-sandbox ./repo /workspace

# 从沙箱下载文件
openshell sandbox download pi-sandbox /workspace/repo ./repo-out

8.5.4 推理路由

OpenShell 提供商可以将原始模型 API Key 保留在沙箱之外。当配置了推理路由时,沙箱内的代码可以调用 https://inference.local,网关在上游注入配置的提供商凭证。

Note

配置 Pi 使用相应的 OpenAI 兼容或 Anthropic 兼容端点,如果你希望模型流量走这条路由。

8.6 三种方案对比

维度 Gondolin Plain Docker OpenShell
隔离程度 工具级 进程级 策略级
认证安全 ✅ Key 在宿主机 ⚠️ Key 进入容器 ✅ Key 在网关
文件访问 仅工作空间 整个挂载点 可策略控制
网络控制 需额外配置 ✅ 内置
进程控制 需额外配置 ✅ 内置
部署复杂度 中等
适用场景 本地开发 简单隔离 企业级安全
Tip

对于大多数个人开发者,Plain Docker 方案足够简单且有效。如果你需要保留认证在宿主机上,选择 Gondolin。如果你需要企业级策略控制,选择 OpenShell