Docker Sandbox Kit Specification v3 带来的关键变化,是把 AI Agent 的网络规则、凭证配置和卷声明打包成普通 OCI 镜像。这样一来,沙箱配置不再只是散落在部署脚本、平台控制台和运维文档里的参数,而能像应用镜像一样构建、推送、固定版本并进入发布流程。
Kit 不只是另一份 Dockerfile
传统 Dockerfile 主要回答“容器里有什么”:基础镜像、依赖、代码、入口命令。Sandbox Kit 更关注“Agent 可以接触什么”:
- 哪些网络目标允许访问,默认是否拒绝其他出站流量;
- 运行时需要哪些凭证,以及凭证由哪里注入;
- 哪些目录需要挂载,挂载点是只读还是可写;
- 当前配置对应哪个不可变版本。
Specification v3 将这些内容装入普通 OCI 镜像,直接复用了成熟的镜像基础设施。团队可以使用现有 Registry 分发 Kit,用摘要定位不可变版本,并把镜像扫描、访问控制和保留策略延伸到沙箱配置。
这里最重要的不是“多构建一个镜像”,而是把 Agent 的运行边界变成可审查、可发布的制品。应用代码和沙箱 Kit 可以分别升级:代码版本变化不一定扩大网络权限,而策略变更也不必重新包装整个应用。
为什么应该使用摘要,而不是只使用标签
OCI 标签适合表达版本意图,例如 agent-kit:v1,但标签通常可以被重新指向。真正稳定的部署引用应使用摘要:
registry.example.com/ai/agent-kit@sha256:0123456789abcdef...
摘要固定的是镜像内容。只要网络规则、凭证声明或卷配置发生变化,镜像内容及其摘要也会变化。这让代码审查和回滚更清晰:变更记录可以准确说明生产环境从哪个 Kit 摘要切换到了哪个摘要。
一种实用的发布方式是:
- 在 Git 中审查 Kit 配置;
- CI 构建 OCI 镜像并推送到 Registry;
- 安全检查通过后记录镜像摘要;
- 部署清单只引用摘要;
- 更新策略时生成新摘要,而不是覆盖旧制品。
动手制作一个最小 Kit 镜像
下面是一个可以直接改造的最小项目。由于摘要信息没有给出 Specification v3 的正式字段名和目录布局,示例中的 JSON 文件属于演示性结构,不代表官方 schema;它展示的是如何把三类配置装入一个普通 OCI 镜像。接入实际运行时前,应将文件名和字段替换成该实现要求的格式。
把以下命令复制到一个空目录中执行:
set -eu
mkdir -p kit
cat > kit/network.json <<'EOF'
{
"defaultAction": "deny",
"egress": [
{
"action": "allow",
"protocol": "https",
"host": "api.github.com",
"port": 443
}
]
}
EOF
cat > kit/credentials.json <<'EOF'
{
"credentials": [
{
"name": "github-token",
"source": {
"type": "environment",
"key": "GITHUB_TOKEN"
}
}
]
}
EOF
cat > kit/volumes.json <<'EOF'
{
"volumes": [
{
"name": "workspace",
"mountPath": "/workspace",
"mode": "rw"
},
{
"name": "reference-data",
"mountPath": "/reference",
"mode": "ro"
}
]
}
EOF
cat > Dockerfile <<'EOF'
FROM scratch
LABEL org.opencontainers.image.title="example-agent-sandbox-kit"
LABEL org.opencontainers.image.description="Illustrative AI agent sandbox policy bundle"
LABEL org.opencontainers.image.version="1.0.0"
COPY kit/ /kit/
EOF
docker build -t example-agent-kit:1.0.0 .
docker image inspect example-agent-kit:1.0.0
这个镜像没有操作系统和执行入口,因为它在示例中只是配置载体,而不是要启动的应用容器。实际 Sandbox Kit 消费方负责拉取并解释其中的内容。
如果要验证可固定的发布流程,可以将它推送到自己的 Registry。执行前修改 REGISTRY,并确保已经通过 docker login 登录:
set -eu
REGISTRY="registry.example.com/your-team"
REF="$REGISTRY/example-agent-kit:1.0.0"
docker tag example-agent-kit:1.0.0 "$REF"
docker push "$REF"
docker buildx imagetools inspect "$REF"
最后一条命令会显示镜像摘要。部署配置可以采用下面的表达方式;字段同样是平台无关的示意,需要适配实际沙箱运行时:
agent:
image: registry.example.com/your-team/coding-agent@sha256:APP_IMAGE_DIGEST
sandbox:
kit: registry.example.com/your-team/example-agent-kit@sha256:KIT_IMAGE_DIGEST
这种分离非常有价值:Agent 应用镜像说明运行什么代码,Kit 镜像说明代码能访问哪些资源。
凭证不要跟着配置一起泄漏
“凭证被打包进 Kit”不应理解为把真实令牌直接写入镜像层。OCI 镜像可能被 Registry 管理员、CI 系统或具有拉取权限的开发者读取,而且删除标签并不能保证历史层立即消失。
更安全的做法是让 Kit 保存凭证声明或引用,例如环境变量名、Secret 标识或外部密钥服务路径;真实值在沙箱启动时注入。实践中还应设置以下边界:
- 不在 Dockerfile、JSON 文件或构建参数中写入真实 Token;
- 将网络策略设为默认拒绝,只开放 Agent 确实需要的目标;
- 对工作目录和参考数据使用不同卷,能只读的卷不要设为可写;
- 限制 Registry 仓库的推送权限,避免未经审查的 Kit 替换正式版本;
- 在部署前验证允许使用的镜像仓库和摘要;
- 保留旧摘要,以便策略更新导致任务失败时快速回滚。
落地时先从一个 Agent 开始
引入 Kit 时,不必立刻迁移所有 Agent。可以选择一个外部依赖清晰的任务,先盘点它访问的域名、凭证和目录,再生成第一版 Kit。观察拒绝日志和任务失败原因,逐项增加最小权限,而不是一开始就允许整个互联网或挂载完整主机目录。
上线前可以用这份检查表收尾:
- Kit 是否由 CI 构建,而不是由个人工作站临时发布;
- 生产部署是否引用 OCI 摘要,而不只是可变标签;
- 镜像中是否只有凭证引用,没有真实密钥;
- 网络规则是否默认拒绝并保持最小开放;
- 每个卷是否明确了挂载路径和读写模式;
- Kit 更新是否经过审查,并保留可回滚的旧摘要。
Sandbox Kit Specification v3 的实际意义,是让 AI Agent 的运行权限拥有与应用代码相似的供应链能力。网络、凭证和存储边界一旦成为可固定的 OCI 制品,就更容易审查差异、复现环境,也更难在一次临时部署中悄悄扩大权限。