diff --git a/docs/template/examples/docker.mdx b/docs/template/examples/docker.mdx
index 718b5e2d..decbc447 100644
--- a/docs/template/examples/docker.mdx
+++ b/docs/template/examples/docker.mdx
@@ -1,9 +1,11 @@
---
title: "Docker"
-description: "Sandbox with Docker installed for running containers"
+description: "Sandbox with Docker or Docker Compose installed for running containers"
---
-## Install Docker
+## Docker
+
+### Template
Use the official installation script from [get.docker.com](https://get.docker.com). The `hello-world` container run validates the installation.
@@ -12,26 +14,26 @@ Use the official installation script from [get.docker.com](https://get.docker.co
// template.ts
import { Template } from 'e2b'
-export const template = Template()
- .fromUbuntuImage('25.04')
- .runCmd('curl -fsSL https://get.docker.com | sudo sh')
- .runCmd('sudo docker run --rm hello-world')
-```
+export const template = Template()
+ .fromUbuntuImage('24.04')
+ .runCmd('curl -fsSL https://get.docker.com | sudo sh')
+ .runCmd('sudo docker run --rm hello-world')
+```
```python Python
# template.py
from e2b import Template
-template = (
- Template()
- .from_ubuntu_image("25.04")
- .run_cmd("curl -fsSL https://get.docker.com | sudo sh")
- .run_cmd("sudo docker run --rm hello-world")
-)
-```
+template = (
+ Template()
+ .from_ubuntu_image("24.04")
+ .run_cmd("curl -fsSL https://get.docker.com | sudo sh")
+ .run_cmd("sudo docker run --rm hello-world")
+)
+```
-## Build the template
+### Build
We recommend at least 2 CPUs and 2 GB of RAM for running Docker containers. **With lower RAM, your sandbox might run out of memory.**
@@ -61,7 +63,7 @@ Template.build(dockerTemplate, 'docker',
```
-## Run containers
+### Run
Run an Alpine container that prints a hello message.
@@ -90,3 +92,178 @@ print(result.stdout)
sbx.kill()
```
+
+## Docker Compose
+
+This example installs Docker and Docker Compose, then validates the setup with a Compose version check and a sample Compose run.
+
+### Template
+
+Create a new file named `template-compose.ts` (or `template_compose.py`).
+
+
+```typescript JavaScript & TypeScript
+// template-compose.ts
+import { Template } from 'e2b'
+
+export const composeTemplate = Template()
+ .fromUbuntuImage('24.04')
+ .runCmd([
+ 'set -euxo pipefail',
+ 'sudo apt-get update',
+ 'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io',
+ 'sudo usermod -aG docker user',
+ 'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose-plugin || true',
+ 'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose-v2 || true',
+ 'sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose || true',
+ 'sudo docker compose version || sudo docker-compose --version',
+ ])
+```
+
+```python Python
+# template_compose.py
+from e2b import Template
+
+compose_template = (
+ Template()
+ .from_ubuntu_image("24.04")
+ .run_cmd(
+ [
+ "set -euxo pipefail",
+ "sudo apt-get update",
+ "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io",
+ "sudo usermod -aG docker user",
+ "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose-plugin || true",
+ "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose-v2 || true",
+ "sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-compose || true",
+ "sudo docker compose version || sudo docker-compose --version",
+ ]
+ )
+)
+```
+
+
+Expected result: you now have a local `template-compose.ts` or `template_compose.py` file.
+
+### Build
+
+
+```typescript JavaScript & TypeScript
+// build-compose.ts
+import { Template, defaultBuildLogger } from 'e2b'
+import { composeTemplate } from './template-compose'
+
+Template.build(composeTemplate, 'docker-compose', {
+ cpuCount: 2,
+ memoryMB: 2048,
+ onBuildLogs: defaultBuildLogger(),
+})
+```
+
+```python Python
+# build_compose.py
+from e2b import Template, default_build_logger
+from template_compose import compose_template
+
+Template.build(compose_template, "docker-compose",
+ cpu_count=2,
+ memory_mb=2048,
+ on_build_logs=default_build_logger(),
+)
+```
+
+
+Expected output (example):
+
+```text
+BuildInfo(... name='docker-compose', alias='docker-compose', tags=['default'])
+```
+
+### Run
+
+
+```typescript JavaScript & TypeScript
+// sandbox-compose.ts
+import { Sandbox } from 'e2b'
+
+const sbx = await Sandbox.create('docker-compose')
+
+await sbx.commands.run('mkdir -p /tmp/docker-compose-test')
+await sbx.files.write('/tmp/docker-compose-test/compose.yaml', [
+ 'services:',
+ ' hello:',
+ ' image: busybox:1.36',
+ ' command: ["sh", "-lc", "echo docker-compose-ok"]',
+ '',
+].join('\n'))
+
+const result = await sbx.commands.run(`
+set -euxo pipefail
+cd /tmp/docker-compose-test
+
+if docker compose version >/dev/null 2>&1; then
+ docker compose up --abort-on-container-exit --remove-orphans
+ docker compose down --remove-orphans -v
+ echo "Docker Compose ran successfully"
+elif docker-compose --version >/dev/null 2>&1; then
+ docker-compose up --abort-on-container-exit --remove-orphans
+ docker-compose down --remove-orphans -v
+ echo "Docker Compose ran successfully"
+else
+ echo "No compose command available"
+ exit 127
+fi
+`)
+
+console.log(result.stdout)
+await sbx.kill()
+```
+
+```python Python
+# sandbox_compose.py
+from e2b import Sandbox
+
+sbx = Sandbox.create("docker-compose")
+
+sbx.commands.run("mkdir -p /tmp/docker-compose-test")
+sbx.files.write(
+ "/tmp/docker-compose-test/compose.yaml",
+ """
+services:
+ hello:
+ image: busybox:1.36
+ command: ["sh", "-lc", "echo docker-compose-ok"]
+""",
+)
+
+result = sbx.commands.run(
+ """
+set -euxo pipefail
+cd /tmp/docker-compose-test
+
+if docker compose version >/dev/null 2>&1; then
+ docker compose up --abort-on-container-exit --remove-orphans
+ docker compose down --remove-orphans -v
+ echo "Docker Compose ran successfully"
+elif docker-compose --version >/dev/null 2>&1; then
+ docker-compose up --abort-on-container-exit --remove-orphans
+ docker-compose down --remove-orphans -v
+ echo "Docker Compose ran successfully"
+else
+ echo "No compose command available"
+ exit 127
+fi
+ """,
+)
+
+print(result.stdout)
+sbx.kill()
+```
+
+
+Expected output (example):
+
+```text
+hello_1 | docker-compose-ok
+Docker Compose ran successfully
+```