使用 Sandbox SDK 构建你的第一个应用——一个安全的代码执行环境。在本指南中,你将创建一个 Worker,可在隔离的 container 中执行 Python 代码并处理文件。
- 注册 Cloudflare 账户 ↗。
- 安装
Node.js↗。
Node.js 版本管理器
使用 Volta ↗ 或 nvm ↗ 等 Node 版本管理器,以避免权限问题并切换 Node.js 版本。本指南后续将介绍的 Wrangler 需要 Node 版本 16.17.0 或更高。
Sandbox SDK 使用 Docker ↗ 与你的 Worker 一起构建 container 镜像。
当您运行 wrangler deploy 时,必须在本地运行 Docker。对于大多数人来说,安装 Docker 的最佳方式是按照安装 Docker Desktop 的文档 ↗进行操作。其他工具(如 Colima ↗)也可能有效。
您可以通过在终端中运行 docker info 命令来检查 Docker 是否正常运行。如果 Docker 正在运行,该命令将成功执行。如果 Docker 未运行,docker info 命令将挂起或返回包含 "Cannot connect to the Docker daemon" 消息的错误。
创建新的 Sandbox SDK 项目:
npm create cloudflare@latest -- my-sandbox --template=cloudflare/sandbox-sdk/examples/minimalyarn create cloudflare my-sandbox --template=cloudflare/sandbox-sdk/examples/minimalpnpm create cloudflare@latest my-sandbox --template=cloudflare/sandbox-sdk/examples/minimal这会创建一个包含所需全部内容的 my-sandbox 目录:
src/index.ts- 集成了沙箱的 Workerwrangler.jsonc- Workers 与 Containers 的配置Dockerfile- Container 环境定义
cd my-sandbox该模板提供了一个最小化的 Worker,演示核心沙箱能力:
import { getSandbox, proxyToSandbox, type Sandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
type Env = {
Sandbox: DurableObjectNamespace<Sandbox>;
};
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
// Get or create a sandbox instance. For user-facing apps,
// derive this ID from the authenticated user.
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Execute Python code
if (url.pathname === "/run") {
const result = await sandbox.exec('python3 -c "print(2 + 2)"');
return Response.json({
output: result.stdout,
error: result.stderr,
exitCode: result.exitCode,
success: result.success,
});
}
// Work with files
if (url.pathname === "/file") {
await sandbox.writeFile("/workspace/hello.txt", "Hello, Sandbox!");
const file = await sandbox.readFile("/workspace/hello.txt");
return Response.json({
content: file.content,
});
}
return new Response("Try /run or /file");
},
};关键概念:
getSandbox()- 按 ID 获取或创建沙箱实例。使用稳定 ID 可重新连接到同一沙箱。在面向用户的应用中,应将 ID 限定到单个用户。sandbox.exec()- 在沙箱中执行 shell 命令,并捕获 stdout、stderr 和退出码。sandbox.writeFile()/readFile()- 在沙箱文件系统中写入和读取文件。
启动开发服务器:
npm run dev
# If you expect to have multiple sandbox instances, you can increase `max_instances`.测试端点:
# Execute Python code
curl http://localhost:8787/run
# File operations
curl http://localhost:8787/file你应看到包含命令输出和文件内容的 JSON 响应。
部署你的 Worker 和 container:
npx wrangler deploy这将:
- 使用 Docker 构建 container 镜像
- 将其推送到 Cloudflare 的 Container Registry
- 在全球部署你的 Worker
检查部署状态:
npx wrangler containers list访问你的 Worker URL(在部署输出中显示):
# Replace with your actual URL
curl https://my-sandbox.YOUR_SUBDOMAIN.workers.dev/run你的沙箱现已部署,可在隔离的 container 中执行代码。
你的 wrangler.jsonc 将三部分连接在一起:
{
"containers": [
{
"class_name": "Sandbox",
"image": "./Dockerfile",
"instance_type": "lite",
"max_instances": 1,
},
],
"durable_objects": {
"bindings": [
{
"class_name": "Sandbox",
"name": "Sandbox",
},
],
},
"migrations": [
{
"new_sqlite_classes": ["Sandbox"],
"tag": "v1",
},
],
}[[containers]]
class_name = "Sandbox"
image = "./Dockerfile"
instance_type = "lite"
max_instances = 1
[[durable_objects.bindings]]
class_name = "Sandbox"
name = "Sandbox"
[[migrations]]
new_sqlite_classes = [ "Sandbox" ]
tag = "v1"- containers - 定义沙箱环境的 container 镜像、实例类型和资源限制。如果预计有多个沙箱实例,可以增加
max_instances。 - durable_objects - 使用 Sandbox SDK 不一定需要熟悉 Durable Objects,但如果你愿意,可以了解更多关于 Cloudflare Containers 与 Durable Objects。此配置会创建一个绑定(binding),使
SandboxDurable Object 可在 Worker 代码中访问。 - migrations - 将由 Sandbox SDK 实现的
Sandbox类注册到 SQLite 存储后端(只需一次)
有关环境变量、密钥和自定义镜像等详细配置选项,请参阅 Wrangler 配置参考。
现在你已有可工作的沙箱,可以探索更多能力:
- 使用 Workers AI 的代码解释器 - 构建 AI 驱动的代码执行系统
- 执行命令 - 运行 shell 命令并流式输出
- 管理文件 - 处理文件和目录
- 暴露服务 - 获取沙箱中运行服务的公共 URL
- Quick tunnels - 用于开发和
.workers.dev部署的零配置*.trycloudflare.comURL - 生产部署 - 为预览 URL 设置自定义域名
- API 参考 - 完整 API 文档