This tutorial shows how to run the OpenShell gateway as a Docker Compose service on a Linux host or on a machine running Docker Desktop (Windows or macOS).
After completing this tutorial you have:
openshell CLI registered against that gateway.openshell CLI installed on your workstation. See Install the CLI below.The Compose configuration lives at deploy/docker/ in the repository.
The Docker compute driver injects host.openshell.internal:<gateway-port> into every sandbox container as its callback address. The gateway listens on port 8080 inside the container, so port 8080 must be published at the same number on the Docker host. Publishing it as a different host port (for example 18080:8080) causes sandbox containers to call back to the wrong port and remain stuck in the Provisioning phase.
If port 8080 is taken, change OPENSHELL_SERVER_PORT and update the port mapping to <your-port>:8080, then set OPENSHELL_PORT=<your-port> in an .env file.
The gateway extracts the openshell-sandbox supervisor binary from ghcr.io/nvidia/openshell/supervisor:latest on first start and caches it at:
This path is used as a bind-mount source when Docker creates sandbox containers. Docker resolves bind-mount sources against the host filesystem, not the container filesystem, so the data directory must be bind-mounted at the same absolute path in both the host and the container.
The Compose file uses /var/lib/openshell for this purpose and sets create_host_path: true so Docker creates it on first run.
Verify the gateway is healthy:
Binary (recommended — macOS / Linux / WSL):
From PyPI (any platform with uv):
On Windows without WSL, install the CLI inside a WSL 2 distribution (for example AlmaLinux or Ubuntu) and run all openshell commands from that distribution.
Run this once after the gateway starts:
Verify the connection:
The output should show Status: Connected.
Set your API key as an environment variable and create a provider:
Confirm the provider was stored:
Sandbox images are pulled automatically on first use, but the initial pull can take several minutes for large images. Pre-pull to avoid long waits at sandbox creation time:
OpenClaw launches directly. The first run pulls the image if it is not cached.
Wait for the phase to change from Provisioning to Ready:
Then connect:
On Linux, host.docker.internal and host.openshell.internal are not automatically resolvable from containers. Add the following under the gateway service in docker-compose.yml: