> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/gym/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/gym/_mcp/server.

# nemo_gym.sandbox.adapters.docker_compose

Run Compose services through the sandbox API.

Input YAML is resolved upstream; unsupported runtime semantics are rejected
before provisioning services.

## Module Contents

### Classes

| Name                                                                                   | Description                                                              |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`AsyncSandboxCompose`](#nemo_gym-sandbox-adapters-docker_compose-AsyncSandboxCompose) | Start services from a Compose YAML file and own their sandbox lifecycle. |

### Functions

| Name                                                             | Description |
| ---------------------------------------------------------------- | ----------- |
| [`_seconds`](#nemo_gym-sandbox-adapters-docker_compose-_seconds) | -           |

### API

```python
class nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose(
    provider,
    compose_file: str | pathlib.Path | None,
    service_specs: collections.abc.Mapping[str, nemo_gym.sandbox.providers.SandboxSpec] | None = None,
    timeout_s: float = 1200,
    poll_interval_s: float = 0.5,
    volume_init_image: str = 'alpine:3.22',
    volume_sources: collections.abc.Mapping[str, str] | None = None
)
```

Start services from a Compose YAML file and own their sandbox lifecycle.

Deployment settings stay in the provider and optional `service_specs`.
Compose fields override the corresponding spec fields.

**`_plans`** `dict[str, dict[str, Any]] = {}`

---

**`_processes`** `dict[str, Task] = {}`

---

**`_runtime_metadata`** `dict[str, dict[str, str]] = {}`

---

**`_seeds`** `list[AsyncSandbox] = []`

---

**`_stop_task`** `Task | None = None`

---

**`_volume_helper`** `AsyncSandbox | None = None`

---

**`compose_file`**

---

**`document`** `dict[str, Any] = {}`

---

**`project`** `= 'compose-' + uuid.uuid4().hex`

---

**`provider`**

---

**`service_specs`** `= dict(service_specs or {})`

---

**`services`** `dict[str, AsyncSandbox] = {}`

---

**`volume_sources`** `= dict(volume_sources or {})`

---

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.__aenter__()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.__aexit__(
    exc = ()
)
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._load()
```

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._prepare()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._prepare_volumes()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._stop()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._validate() -> list[str]
```

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose._wait(
    name,
    condition
)
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.connect(
    descriptor: collections.abc.Mapping[str, typing.Any],
    provider
) -> nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose
```

async

classmethod

Connect to all members without provisioning or restarting services.

Like AsyncSandbox.connect, stop() closes the connected sandboxes using
provider semantics. The creator retains ownership of managed-volume
cleanup and running service/forwarding tasks and must also call stop().

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.serialize(
    scope: str | None = None
) -> dict[str, typing.Any]
```

async

Describe a running collection using provider connection descriptors.

The creating process must keep the collection alive: it owns service
and forwarding tasks and managed-volume cleanup. Provider configuration
and YAML are not included.

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.start()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose.AsyncSandboxCompose.stop()
```

async

```python
nemo_gym.sandbox.adapters.docker_compose._seconds(
    value: str | int | float
) -> float
```