# DockerSandbox Executes commands inside Docker containers on the local machine. Uses long-lived containers with `docker exec` for command execution. Targets local development, CI/CD, air-gapped deployments, and cost-sensitive scenarios where cloud sandboxes are unnecessary. > **Info:** For interface details, see [WorkspaceSandbox interface](https://mastra.ai/reference/workspace/sandbox). ## Installation **npm**: ```bash npm install @mastra/docker ``` **pnpm**: ```bash pnpm add @mastra/docker ``` **Yarn**: ```bash yarn add @mastra/docker ``` **Bun**: ```bash bun add @mastra/docker ``` Requires [Docker Engine](https://docs.docker.com/engine/install/) running on the host machine. ## Usage Add a `DockerSandbox` to a workspace and assign it to an agent: ```typescript import { Agent } from '@mastra/core/agent' import { Workspace } from '@mastra/core/workspace' import { DockerSandbox } from '@mastra/docker' const workspace = new Workspace({ sandbox: new DockerSandbox({ image: 'node:22-slim', }), }) const agent = new Agent({ name: 'dev-agent', model: 'anthropic/claude-opus-4-6', workspace, }) ``` ## Constructor parameters **id** (`string`): Unique identifier for this sandbox instance. Used for container naming and reconnection via labels. (Default: `Auto-generated`) **image** (`string`): Docker image to use for the container. (Default: `'node:22-slim'`) **command** (`string[]`): Container entrypoint command. Must keep the container alive for exec-based command execution. (Default: `['sleep', 'infinity']`) **env** (`Record`): Environment variables to set in the container. **volumes** (`Record`): Host-to-container bind mounts. Keys are host paths, values are container paths. **network** (`string`): Docker network to join. **privileged** (`boolean`): Run in privileged mode. (Default: `false`) **workingDir** (`string`): Working directory inside the container. (Default: `'/workspace'`) **labels** (`Record`): Additional container labels. Mastra labels (mastra.sandbox, mastra.sandbox.id) are always included. **timeout** (`number`): Default command timeout in milliseconds. (Default: `300000 (5 minutes)`) **dockerOptions** (`Docker.DockerOptions`): Pass-through dockerode connection options for custom socket paths, remote hosts, or TLS certificates. **instructions** (`string | function`): Custom instructions that override the default instructions returned by getInstructions(). Pass an empty string to suppress instructions. ## Properties **id** (`string`): Sandbox instance identifier. **name** (`string`): Provider name ('DockerSandbox'). **provider** (`string`): Provider identifier ('docker'). **status** (`ProviderStatus`): 'pending' | 'starting' | 'running' | 'stopping' | 'stopped' | 'destroying' | 'destroyed' | 'error' **container** (`Container`): The underlying dockerode Container instance. Throws SandboxNotReadyError if the sandbox has not been started. **processes** (`DockerProcessManager`): Background process manager. See \[SandboxProcessManager reference]\(/reference/workspace/process-manager). ## Background processes `DockerSandbox` includes a built-in process manager for spawning and managing background processes. Processes run inside the container using `docker exec`. ```typescript const sandbox = new DockerSandbox({ id: 'dev-sandbox' }) await sandbox._start() // Spawn a background process const handle = await sandbox.processes.spawn('node server.js', { env: { PORT: '3000' }, onStdout: data => console.log(data), }) // Interact with the process console.log(handle.stdout) await handle.sendStdin('input\n') await handle.kill() ``` See [`SandboxProcessManager` reference](https://mastra.ai/reference/workspace/process-manager) for the full API. ## Environment variables Set environment variables at the container level with `env`. Per-command environment variables can also be passed when spawning processes: ```typescript const sandbox = new DockerSandbox({ image: 'node:22-slim', env: { NODE_ENV: 'production', DATABASE_URL: 'postgres://localhost:5432/mydb', }, }) ``` ## Bind mounts Mount host directories into the container using the `volumes` option: ```typescript const sandbox = new DockerSandbox({ image: 'node:22-slim', volumes: { '/my/project': '/workspace/project', '/shared/data': '/data', }, }) ``` Bind mounts are applied at container creation time. The host paths must exist before the sandbox starts. ## Reconnection `DockerSandbox` can reconnect to existing containers by matching labels. When `start()` is called, it checks for a container with the `mastra.sandbox.id` label matching the sandbox ID. If found: - A running container is reused directly. - A stopped container is restarted. ```typescript // First run — creates a new container const sandbox = new DockerSandbox({ id: 'persistent-sandbox' }) await sandbox._start() // Later — reconnects to the existing container const sandbox2 = new DockerSandbox({ id: 'persistent-sandbox' }) await sandbox2._start() ``` ## Docker connection options Connect to remote Docker hosts or use custom socket paths via `dockerOptions`: ```typescript // Remote Docker host const sandbox = new DockerSandbox({ dockerOptions: { host: '192.168.1.100', port: 2376, ca: fs.readFileSync('ca.pem'), cert: fs.readFileSync('cert.pem'), key: fs.readFileSync('key.pem'), }, }) // Custom socket path const sandbox = new DockerSandbox({ dockerOptions: { socketPath: '/var/run/docker.sock', }, }) ``` ## Related - [SandboxProcessManager reference](https://mastra.ai/reference/workspace/process-manager) - [WorkspaceSandbox interface](https://mastra.ai/reference/workspace/sandbox) - [LocalSandbox reference](https://mastra.ai/reference/workspace/local-sandbox) - [E2BSandbox reference](https://mastra.ai/reference/workspace/e2b-sandbox) - [Workspace overview](https://mastra.ai/docs/workspace/overview)