Skip to content

什么是 Template

一句话定义

在 CubeSandbox 中,Template 是创建 Sandbox 的标准化母版

它不是一个简单镜像标签,也不是一个压缩包,而是一个已经完成“环境准备、状态固化、可复用发布”的平台对象。后续每次创建 Sandbox,本质上都是在某个 Template 的基础上实例化。

为什么 Template 是 CubeSandbox 的核心概念

如果没有 Template,CubeSandbox 每次创建 Sandbox 都只能从最原始的输入现场做一遍:

  • 拉镜像
  • 解包文件系统
  • 启动 Guest
  • 初始化语言运行时
  • 等待服务 ready
  • 再把环境交给用户

这样做的问题非常明显:

  • 启动慢
  • 抖动大
  • 无法高并发稳定交付
  • 环境一致性差

CubeSandbox 之所以能把一个“完整可服务的隔离环境”交付得足够快,是因为它把 环境准备实例交付 分成了两个阶段:

  1. 先制作 Template
  2. 再基于 Template 快速生成 Sandbox

Template 的存在,等于把“昂贵的初始化过程”从在线请求路径中提前剥离出去。

Template 不是镜像

这是最容易混淆的点。

镜像是输入

镜像(例如 OCI image)更像构建原材料。

它告诉系统:

  • 基础文件系统内容是什么
  • 需要哪些二进制、库、依赖
  • 初始文件布局大致是什么

但镜像本身并不天然等于“可极速交付的沙箱环境”。

Template 是平台发布物

Template 是系统把镜像、初始化过程、快照、探针、暴露端口等信息整合之后,形成的 可被反复实例化的发布对象

也就是说:

  • 镜像更像“食材”
  • Template 更像“备好菜的套餐”

CubeSandbox 真正反复复用的对象是 Template,不是原始镜像。

Template 到底包含什么

从概念上讲,一个 Template 至少包含四类内容。

1. 基础文件系统结果

Template 必须有一个可供后续实例复用的基础文件系统视图。

这部分通常来自:

  • OCI 镜像
  • Dockerfile 构建结果
  • 初始化后的 rootfs

它决定 Sandbox 启动后“能看到什么文件”。

2. 预热后的运行状态

这是 Template 真正拉开差距的地方。

CubeSandbox 不只是保存“磁盘内容”,还会在冷启动并完成关键初始化之后,把可复用状态固定下来。这样后续实例就不必再从零等待所有运行时完成初始化。

这部分状态通常与快照能力直接相关。

3. 服务入口定义

Template 不只是“能启动”,还要定义“什么时候算可用”。

因此它通常还包含:

  • 哪些端口需要暴露
  • 哪个端口作为 probe / readiness 依据
  • 哪些运行时行为是模板的一部分

对于代码解释器、浏览器自动化、开发环境这类场景,这一点尤其重要。

4. 平台元数据

Template 作为控制面的对象,还会携带元信息,例如:

  • 模板 ID
  • 来源镜像
  • 规格和限制
  • 创建状态与阶段
  • 发布可见性或可用性状态

这些信息使 Template 能成为调度与 API 层真正可引用的对象。

Template 为什么不是“把环境打包一下”那么简单

如果只从表面看,Template 好像只是环境归档。

但实际上,Template 承担的是三个更深的角色。

1. 一致性锚点

Template 让一批 Sandbox 共享同一个起点。

这意味着:

  • 相同 Template 创建出的实例环境一致
  • 行为差异更多来自实例写时状态,而不是基础环境漂移
  • 平台可以更稳定地复现问题与回滚变更

2. 性能锚点

Template 是极速交付的前提。

如果没有模板化,CubeSandbox 很难把“隔离环境 + 服务能力”同时做到低时延。

3. 发布锚点

Template 让环境从“开发产物”变成“平台发布物”。

用户不是直接操作镜像、内核参数、rootfs 路径,而是通过 Template ID 申请实例。

这和 Kubernetes 里 Deployment / PodTemplate 的作用有点像:它把底层细节收敛成了一个可发布抽象。

Template 的生命周期

可以把 Template 的生命周期理解成三个阶段。

1. 构建阶段

这一阶段的目标,是从原始输入生成可运行环境基础。

典型动作包括:

  • 拉取或读取 OCI 镜像
  • 构建 rootfs
  • 安装依赖与初始化文件
  • 准备基本运行环境

此时产物更接近“静态环境基础”。

2. 预热与固化阶段

这是 Template 和普通镜像分道扬镳的关键阶段。

系统会真正启动这个环境,让它走到一个“适合复用”的状态,然后再把状态固化下来。

例如:

  • Guest 完成启动
  • 语言运行时加载完毕
  • 服务端口 ready
  • 某些高频初始化已经做完

这一步决定后续 Sandbox 能否真正实现热启动与低抖动交付。

3. 发布阶段

一旦模板状态达到平台要求,它就从“构建中的临时结果”变成“可供请求引用的对象”。

此时控制面可以:

  • 列出它
  • 监控它
  • 用它创建 Sandbox
  • 在必要时删除或替换它

这一步把 Template 从构建流水线对象,变成了平台 API 对象。

Template 与 Sandbox 的真正关系

最常见的一句正确但不够完整的话是:

Sandbox 是由 Template 创建出来的。

更完整的说法应该是:

Template 定义了 Sandbox 的起点、基础状态和可复用准备结果;Sandbox 则是在这个起点之上的一次具体实例化。

这意味着:

  • 同一个 Template 可以生成很多 Sandbox
  • 这些 Sandbox 共享同一母版语义,但不共享实例级状态
  • Template 决定基础一致性,Sandbox 决定运行时个体差异

Template 与 Snapshot 的关系

Template 和 Snapshot 高度相关,但不是同一个概念。

Snapshot 更偏机制

Snapshot 关注的是“如何保存与恢复某个运行状态”。

Template 更偏产品对象

Template 关注的是“一个可被平台发布和引用的环境母版”。

可以把两者关系理解成:

  • Snapshot 是 Template 的关键能力组成部分
  • Template 则是把 Snapshot、文件系统、服务定义和元数据组合起来后的平台对象

为什么 Template 在 Agent 场景里尤其重要

CubeSandbox 的主要场景之一是 AI Agent 的代码执行与工具调用。

这类场景对环境有几个特殊要求:

  1. 启动要快:Agent 通常频繁创建和销毁执行环境。
  2. 环境要稳定:同一个任务重试时,希望环境行为可复现。
  3. 服务要现成:很多环境不只是跑一次脚本,还需要已有的 Python、Node、浏览器或 API 服务。
  4. 隔离要强:不能因为追求速度退回共享内核模型。

Template 恰好就是同时满足这四点的关键抽象。

常见误解

误解一:Template 就是 Docker Image

不对。

Docker Image 是常见输入,但 Template 是 CubeSandbox 平台内部真正用于复用和交付的对象。

误解二:Template 越多越好

不一定。

Template 本身也是平台资产,需要构建、存储、管理和运维。过多模板会增加治理复杂度。

更合理的做法通常是:

  • 用少量稳定模板覆盖主流场景
  • 把场景差异控制在模板边界内
  • 只在确实需要隔离环境差异时新增模板

误解三:有了 Template 就不需要实例级可写状态

不对。

Template 只是统一起点。Sandbox 在运行中仍然需要自己的实例级差异状态,例如临时文件、运行输出、依赖缓存、工作目录改动等。

平台设计者最该关注什么

如果你负责平台设计或运维,理解 Template 时要重点关注四件事:

  1. Template 是性能资产,不只是配置资产。
  2. Template 是一致性资产,不只是构建产物。
  3. Template 决定了 Sandbox 的默认运行语义。
  4. Template 的治理质量,会直接影响实例创建体验和系统稳定性。

与相关文档的关系

下一步

理解 Template 后,下一个问题通常是:

这个母版最后是如何变成一个真正运行中的隔离环境的?

这就要进入运行时抽象: 什么是 MicroVM、Runtime 与 Guest