每个沙箱都运行在一个隔离的 Linux 容器中,预装了 Python、Node.js 和常用的开发工具。有关预装软件的完整列表以及如何自定义容器镜像,请参阅 Dockerfile 参考。
在运行时使用标准包管理器安装额外的软件:
# Python packages
pip install scikit-learn tensorflow
# Node.js packages
npm install express
# System packages (requires apt-get update first)
apt-get update && apt-get install -y redis-server该容器提供了一个标准的 Linux 文件系统。您可以在拥有权限的任何地方进行读写。
标准目录:
/workspace- 用户代码的默认工作目录/tmp- 临时文件/home- 用户家目录/usr/bin,/usr/local/bin- 可执行二进制文件
示例:
await sandbox.writeFile('/workspace/app.py', 'print("Hello")');
await sandbox.writeFile('/tmp/cache.json', '{}');
await sandbox.exec('ls -la /workspace');进程在常规 Linux 环境中按预期运行。
前台进程 (exec()):
const result = await sandbox.exec('npm test');
// 等待完成,返回输出后台进程 (startProcess()):
const process = await sandbox.startProcess('node server.js');
// 立即返回,进程在后台运行出站连接正常工作:
curl https://api.example.com/data
pip install requests
npm install express入站连接需要暴露端口:
const { hostname } = new URL(request.url);
await sandbox.startProcess('python -m http.server 8000');
const exposed = await sandbox.exposePort(8000, { hostname });
console.log(exposed.url); // 公共 URLLocalhost 在沙箱内正常工作:
redis-server & # 启动服务器
redis-cli ping # 本地连接沙箱之间(隔离):
- 每个沙箱都是一个独立的容器
- 文件系统、内存和网络都是隔离的
沙箱内部(共享):
- 所有进程都看到相同的文件
- 进程可以相互通信
- 环境变量是会话作用域的
要运行不受信任的代码,请为每个用户使用独立的沙箱:
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);无法:
- 加载内核模块或访问主机硬件
- 架构 - 容器如何适应系统
- 安全模型 - 容器隔离细节
- 沙箱生命周期 - 容器生命周期管理
- Docker-in-Docker - 在沙箱内运行 Docker 容器