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 +```