通过沙箱模板可以自定义您的沙箱环境。

PPIO Agent 沙箱服务已经内置一些公共模板方便您开箱即用,您可以在 控制台 找到这些公共模板。

我们通过您定义的 e2b.Dockerfile 来创建一个新的沙箱模板,并返回模板 ID 用于创建沙箱。详见下方教程。

如何创建自定义沙箱

参考步骤:

  1. 安装 E2B 命令行工具
  2. 初始化沙箱模板
  3. 自定义e2b.Dockerfile
  4. 构建您的沙箱模板
  5. 启动您的自定义沙箱

1. 安装 E2B 命令行工具

请参考 教程 来进行安装,并完成 认证

2. 初始化沙箱模板

以下命令将在当前目录下创建一个基础 e2b.Dockerfile 文件。

export E2B_DOMAIN=sandbox.ppio.cn
e2b template init

3. 自定义e2b.Dockerfile

现在您可以通过编辑 e2b.Dockerfile 文件来自定义您的沙箱模板。

# 本文档示例使用这个基础镜像,请保持不变
FROM e2bdev/code-interpreter:latest
# 安装一些 python 包
RUN pip install cowsay

4. 构建沙箱模板

现在您可以开始构建沙箱模板。下面命令会调用本地 Docker 工具来构建镜像,然后将其推送到 PPIO 的远程镜像仓库。

我们会在云端将 Docker 镜像转换为 firecracker 的 microVM 镜像,后续会基于该镜像来启动沙箱实例。

export E2B_DOMAIN=sandbox.ppio.cn
e2b template build -c "/root/.jupyter/start-up.sh"

这个过程需要一些时间。最后,您会得到模板 ID,后面我们使用它通过 SDK 创建沙箱。

5. 启动您的自定义沙箱

现在您可以使用上一步获得的模板 ID 来创建沙箱。

import { sandbox } from '@e2b/code-interpreter'

// 在上一步创建的模板 ID 
const templateID = 'id-of-your-template'

// 将模板 ID 传递给 `Sandbox.create` 方法
const sandbox = await Sandbox.create(templateID)

// 模板已安装 cowsay,可以直接使用它
const execution = await sandbox.runCode(`
import cowsay
cowsay.say('Hello from E2B!')
`)

console.log(execution.stdout)

工作原理

每次构建一个沙箱模板时,我们都会基于 e2b.Dockerfile 文件创建一个容器。我们会提取容器的文件系统,进行配置(例如安装所需依赖项等),然后启动一个沙箱实例。

接下来我们会:

  1. 获取正在运行的沙箱实例。
  2. 执行 启动命令。仅当您指定了 “启动命令” 则会执行该步骤,否则跳过。
  3. 等待就绪(如果指定了 “启动命令”,则默认等待 20 秒,否则立即就绪)。就绪检查逻辑可以通过 就绪命令 进行配置。
  4. 对当前正在运行的沙箱进行快照并使其准备好供后续创建沙箱时使用。

我们将最后产生的 “沙箱快照” 称为沙箱模板

我们将整个沙箱的文件系统连同所有正在运行的进程以一种 “稍后可快速加载” 的方式进行序列化和保存。

这使我们能够在稍后的任何时候在几百毫秒内加载沙箱,加载后,所有进程处于运行状态,并且文件系统完全保持原样。