Sandbox plugin · listing tai42/sandbox-dockerInstall
Permissions
Provides
docker
Sandbox — Docker sandbox provider — per-session containers on a remote engine over the Docker Engine API.
The Docker sandbox provider runs each session as its own container on a REMOTE
Docker engine, reached over the Docker Engine API. The app container drives that
engine over mTLS: it spawns no local process, holds no host Docker socket, and
mounts no host path. Real work in a session is driven through the engine’s exec
API against a hardened, idle session container.
Enable it
manifest.yml
Configuration
TheSANDBOX_DOCKER_ env group. SANDBOX_DOCKER_HOST is the only variable that
enters the recycle-pinned app env; the mTLS client certificates are read from the
canonical /certs/client mount, never from the environment.
A session spec’s
cpu / memory_mb always win over the defaults; the provider
never silently runs uncapped when a cap was requested, and rejects a cap it
cannot express rather than downgrading it.
Security model
- Remote engine over mTLS. The app container talks to a remote engine; it never holds a host Docker socket and never runs privileged.
- Per-session containers, hardened. Every session container is created with
no-new-privileges, all Linux capabilities dropped, never privileged, and no host bind mount of any path. - Single-workspace-mount isolation invariant. A session container mounts ONLY its own workspace volume — never the engine client-certs volume, never a host path — so a session can never read the mTLS client identity that speaks the control API.
- Network tiers.
noneattaches no network beyond loopback;internaljoins an isolated bridge with no external routing;egressjoins the engine’s NAT’d bridge with the public internet reachable. Egress default is OPEN. - Honest residual. Under open egress, tool-RESULT data a session produces is exfiltratable — egress is default-open by design. The egress firewall that drops the control plane, RFC1918 ranges, and cloud metadata is provisioned at the tai-distribution layer, not by this provider.
Durability model
- Ephemeral sessions get an anonymous workspace volume that is reaped with the session — scratch that dies with it.
- Persistent sessions bind a named
tai-sbx-<workspace_key>volume that survives the session and its reap. Only an explicit teardown removes it, and even then unforced, so the engine’s own “volume in use” guard blocks removal while another worker still references it.

