Declarative Builder
Declarative Builder provides a powerful, code-first approach to defining dependencies for Daytona Sandboxes. Instead of importing images from a container registry, you can programmatically define them using the Daytona SDK.
The declarative builder system supports two primary workflows:
- Declarative images: build images with varying dependencies on demand when creating sandboxes
- Pre-built Snapshots: create and register ready-to-use Snapshots that can be shared across multiple sandboxes
Build declarative images
Daytona provides an option to create declarative images on-the-fly when creating sandboxes. This is ideal for iterating quickly without creating separate snapshots.
Declarative images are cached for 24 hours, and are automatically reused when running the same script. Thus, subsequent runs on the same runner will be almost instantaneous.
# Define a declarative image with python packagesdeclarative_image = ( Image.debian_slim("3.12") .pip_install(["requests", "pytest"]) .workdir("/home/daytona"))
# Create a new sandbox with the declarative image and stream the build logssandbox = daytona.create( CreateSandboxFromImageParams(image=declarative_image), timeout=0, on_snapshot_create_logs=print,)// Define a declarative image with python packagesconst declarativeImage = Image.debianSlim('3.12') .pipInstall(['requests', 'pytest']) .workdir('/home/daytona')
// Create a new sandbox with the declarative image and stream the build logsconst sandbox = await daytona.create( { image: declarativeImage, }, { timeout: 0, onSnapshotCreateLogs: console.log, })For more information, see the Python SDK and TypeScript SDK references:
Create pre-built Snapshots
Daytona provides an option to create pre-built snapshots that can be reused across multiple sandboxes.
The snapshot remains visible in the Daytona Dashboard ↗ and is permanently cached, ensuring instant availability without rebuilding.
# Create a python data science imagesnapshot_name = "data-science-snapshot"
image = ( Image.debian_slim("3.12") .pip_install(["pandas", "numpy"]) .workdir("/home/daytona"))
# Create the snapshot and stream the build logsdaytona.snapshot.create( CreateSnapshotParams( name=snapshot_name, image=image, ),on_logs=print,)
# Create a new sandbox using the pre-built snapshotsandbox = daytona.create(CreateSandboxFromSnapshotParams(snapshot=snapshot_name))// Create a python data science imageconst snapshotName = 'data-science-snapshot'
const image = Image.debianSlim('3.12') .pipInstall(['pandas', 'numpy']) .workdir('/home/daytona')
// Create the snapshot and stream the build logsawait daytona.snapshot.create( { name: snapshotName, image, }, { onLogs: console.log, })
// Create a new sandbox using the pre-built snapshotconst sandbox = await daytona.create({ snapshot: snapshotName,})For more information, see the Python SDK and TypeScript SDK references:
Image configuration
Daytona provides an option to define images programmatically using the Daytona SDK. You can specify base images, install packages, add files, set environment variables, and more.
For a complete API reference and method signatures, see the Python and TypeScript SDK references.
Base image selection
Daytona provides an option to select base images. The following snippets demonstrate how to select and configure base images:
# Create an image from a baseimage = Image.base("python:3.12-slim-bookworm")
# Use a Debian slim image with Python 3.12image = Image.debian_slim("3.12")// Create an image from a baseconst image = Image.base('python:3.12-slim-bookworm')
// Use a Debian slim image with Python 3.12const image = Image.debianSlim('3.12')For more information, see the Python SDK and TypeScript SDK references:
Package management
Daytona provides an option to install packages and dependencies to your image. The following snippets demonstrate how to install packages and dependencies to your image:
# Add pip packagesimage = Image.debian_slim("3.12").pip_install("requests", "pandas")
# Install from requirements.txtimage = Image.debian_slim("3.12").pip_install_from_requirements("requirements.txt")
# Install from pyproject.toml (with optional dependencies)image = Image.debian_slim("3.12").pip_install_from_pyproject("pyproject.toml", optional_dependencies=["dev"])// Add pip packagesconst image = Image.debianSlim('3.12').pipInstall(['requests', 'pandas'])
// Install from requirements.txtconst image = Image.debianSlim('3.12').pipInstallFromRequirements('requirements.txt')
// Install from pyproject.toml (with optional dependencies)const image = Image.debianSlim('3.12').pipInstallFromPyproject('pyproject.toml', { optionalDependencies: ['dev']})For more information, see the Python SDK and TypeScript SDK references:
pip_install_from_requirements (Python SDK)
pipInstallFromRequirements (TypeScript SDK)
File system operations
Daytona provides an option to add files and directories to your image. The following snippets demonstrate how to add files and directories to your image:
# Add a local fileimage = Image.debian_slim("3.12").add_local_file("package.json", "/home/daytona/package.json")
# Add a local directoryimage = Image.debian_slim("3.12").add_local_dir("src", "/home/daytona/src")// Add a local fileconst image = Image.debianSlim('3.12').addLocalFile('package.json', '/home/daytona/package.json')
// Add a local directoryconst image = Image.debianSlim('3.12').addLocalDir('src', '/home/daytona/src')For more information, see the Python SDK and TypeScript SDK references:
Environment configuration
Daytona provides an option to configure environment variables and working directories. The following snippets demonstrate how to configure environment variables and working directories:
# Set environment variablesimage = Image.debian_slim("3.12").env({"PROJECT_ROOT": "/home/daytona"})
# Set working directoryimage = Image.debian_slim("3.12").workdir("/home/daytona")// Set environment variablesconst image = Image.debianSlim('3.12').env({ PROJECT_ROOT: '/home/daytona' })
// Set working directoryconst image = Image.debianSlim('3.12').workdir('/home/daytona')For more information, see the Python SDK and TypeScript SDK references:
Commands and entrypoints
Daytona provides an option to execute commands during build and configure container startup behavior. The following snippets demonstrate how to execute commands during build and configure container startup behavior:
# Run shell commands during buildimage = Image.debian_slim("3.12").run_commands( 'apt-get update && apt-get install -y git', 'groupadd -r daytona && useradd -r -g daytona -m daytona', 'mkdir -p /home/daytona/workspace')
# Set entrypointimage = Image.debian_slim("3.12").entrypoint(["/bin/bash"])
# Set default commandimage = Image.debian_slim("3.12").cmd(["/bin/bash"])// Run shell commands during buildconst image = Image.debianSlim('3.12').runCommands( 'apt-get update && apt-get install -y git', 'groupadd -r daytona && useradd -r -g daytona -m daytona', 'mkdir -p /home/daytona/workspace')
// Set entrypointconst image = Image.debianSlim('3.12').entrypoint(['/bin/bash'])
// Set default commandconst image = Image.debianSlim('3.12').cmd(['/bin/bash'])For more information, see the Python SDK and TypeScript SDK references:
Dockerfile integration
Daytona provides an option to integrate existing Dockerfiles or add custom Dockerfile commands. The following snippets demonstrate how to integrate existing Dockerfiles or add custom Dockerfile commands:
# Add custom Dockerfile commandsimage = Image.debian_slim("3.12").dockerfile_commands(["RUN echo 'Hello, world!'"])
# Use an existing Dockerfileimage = Image.from_dockerfile("Dockerfile")
# Extend an existing Dockerfileimage = Image.from_dockerfile("app/Dockerfile").pip_install(["numpy"])// Add custom Dockerfile commandsconst image = Image.debianSlim('3.12').dockerfileCommands(['RUN echo "Hello, world!"'])
// Use an existing Dockerfileconst image = Image.fromDockerfile('Dockerfile')
// Extend an existing Dockerfileconst image = Image.fromDockerfile("app/Dockerfile").pipInstall(['numpy'])For more information, see the Python SDK and TypeScript SDK references:
dockerfile_commands (Python SDK)