每个沙箱都在隔离的 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');
// Waits for completion, returns output后台进程 (startProcess()):
const process = await sandbox.startProcess('node server.js');
// Returns immediately, process runs in background出站连接 正常工作:
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); // Public URLLocalhost 在沙箱内正常工作:
redis-server & # Start server
redis-cli ping # Connect locally沙箱之间(隔离):
- 每个沙箱都是一个独立的容器
- 文件系统、内存和网络都是隔离的
沙箱内部(共享):
- 所有进程都看到相同的文件
- 进程可以相互通信
- 环境变量是会话作用域的
要运行不受信任的代码,请为每个用户使用独立的沙箱:
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);无法:
- 加载内核模块或访问主机硬件
- 部署 Sandbox 应用程序 - 部署并保持软件包与镜像一致
- 部署容器 - 容器部署路径
- 架构 - 容器如何融入系统
- 安全模型 - 容器隔离详细信息
- 沙箱生命周期 - 容器生命周期管理
- Docker-in-Docker - 在 Sandbox 中运行 Docker 容器