Container runtime
Each sandbox runs in an isolated Linux container based on Ubuntu 22.04.
The base container comes pre-packaged with a full development environment:
Languages and runtimes:
- Python 3.11 (with pip)
- Node.js 20 LTS (with npm)
- Bun (JavaScript/TypeScript runtime)
Python packages:
- NumPy - Numerical computing
- pandas - Data analysis
- Matplotlib - Plotting and visualization
- IPython - Interactive Python
Development tools:
- Git - Version control
- Build tools (gcc, make, pkg-config)
- Text editors (vim, nano)
- Process monitoring (htop, procps)
Utilities:
- curl, wget - HTTP clients
- jq - JSON processor
- Network tools (ping, dig, netstat)
- Compression (zip, unzip)
Install additional software at runtime or customize the base image:
# Python packagespip install scikit-learn tensorflow
# Node.js packagesnpm install express
# System packagesapt-get install redis-server
The container provides a standard Linux filesystem. You can read and write anywhere you have permissions.
Standard directories:
/workspace
- Default working directory for user code/tmp
- Temporary files/home
- User home directory/usr/bin
,/usr/local/bin
- Executable binaries
Example:
await sandbox.writeFile('/workspace/app.py', 'print("Hello")');await sandbox.writeFile('/tmp/cache.json', '{}');await sandbox.exec('ls -la /workspace');
Processes run as you'd expect in a regular Linux environment.
Foreground processes (exec()
):
const result = await sandbox.exec('npm test');// Waits for completion, returns output
Background processes (startProcess()
):
const process = await sandbox.startProcess('node server.js');// Returns immediately, process runs in background
Outbound connections work:
curl https://api.example.com/datapip install requestsnpm install express
Inbound connections require port exposure:
await sandbox.startProcess('python -m http.server 8000');const exposed = await sandbox.exposePort(8000);console.log(exposed.exposedAt); // Public URL
Localhost works within sandbox:
redis-server & # Start serverredis-cli ping # Connect locally
Between sandboxes (isolated):
- Each sandbox is a separate container
- Filesystem, memory and network are all isolated
Within sandbox (shared):
- All processes see the same files
- Processes can communicate with each other
- Environment variables are session-scoped
To run untrusted code, use separate sandboxes per user:
const sandbox = getSandbox(env.Sandbox, `user-${userId}`);
Cannot:
- Load kernel modules or access host hardware
- Run nested containers (no Docker-in-Docker)
- Architecture - How containers fit in the system
- Security model - Container isolation details
- Sandbox lifecycle - Container lifecycle management
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Directory
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- © 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark
-