Containers
Docker
Docker es opcional. Úsalo para un entorno de Gateway aislado y desechable, o para un host sin instalaciones locales. Si ya desarrollas en tu propia máquina, usa en su lugar el flujo de instalación normal.
El backend de sandbox predeterminado usa Docker cuando agents.defaults.sandbox está habilitado, pero el sandboxing está desactivado de forma predeterminada y no requiere que el Gateway se ejecute en Docker. También están disponibles los backends de sandbox SSH y OpenShell; consulta Sandboxing.
Requisitos previos
- Docker Desktop (o Docker Engine) + Docker Compose v2
- Al menos 2 GB de RAM para compilar la imagen (
pnpm installpuede ser terminado por OOM en hosts de 1 GB con salida 137) - Espacio suficiente en disco para imágenes y registros
- En un VPS/host público, revisa Refuerzo de seguridad para exposición de red, especialmente la cadena de firewall
DOCKER-USERde Docker
Gateway en contenedor
Compilar la imagen
Desde la raíz del repositorio:
./scripts/docker/setup.shEsto compila la imagen del Gateway localmente como openclaw:local. Para usar en su lugar una imagen precompilada:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"./scripts/docker/setup.shLas imágenes precompiladas se publican primero en GitHub Container Registry. GHCR es el registro principal para automatización de versiones, despliegues fijados y comprobaciones de procedencia. La misma versión publica un espejo de Docker Hub en openclaw/openclaw:
export OPENCLAW_IMAGE="openclaw/openclaw:latest"./scripts/docker/setup.shUsa ghcr.io/openclaw/openclaw u openclaw/openclaw y evita espejos no oficiales, que no comparten la cadencia de publicación ni la política de retención de OpenClaw. Etiquetas oficiales: main, latest, <version> (por ejemplo, 2026.2.26) y etiquetas beta como 2026.2.26-beta.1 (las betas nunca mueven latest/main). La imagen predeterminada main/latest/<version> incluye los plugins codex y diagnostics-otel. Una variante -browser (por ejemplo, latest-browser) también incluye Chromium integrado, útil para la herramienta de navegador en sandbox sin una instalación inicial de Playwright.
Reejecución sin conexión
En hosts sin conexión, transfiere y carga primero la imagen:
docker load -i openclaw-image.tarexport OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"./scripts/docker/setup.sh --offline--offline verifica que OPENCLAW_IMAGE ya exista localmente, desactiva las extracciones/compilaciones implícitas de Compose y luego ejecuta el flujo normal: sincronización de .env, correcciones de permisos, onboarding, sincronización de configuración del Gateway, arranque de Compose.
Si OPENCLAW_SANDBOX=1, la configuración sin conexión también comprueba las imágenes de sandbox predeterminadas configuradas y por agente en el daemon detrás de OPENCLAW_DOCKER_SOCKET, incluida la etiqueta de contrato de navegador en imágenes de navegador respaldadas por Docker. Si falta una imagen requerida o está obsoleta, la configuración sale sin cambiar la configuración del sandbox en lugar de informar un éxito roto.
Completar el onboarding
El script de configuración ejecuta el onboarding automáticamente:
- solicita claves de API del proveedor
- genera un token de Gateway y lo escribe en
.env - crea el directorio de claves secretas del perfil de autenticación
- inicia el Gateway mediante Docker Compose
El onboarding previo al arranque y las escrituras de configuración se ejecutan directamente mediante openclaw-gateway (con --no-deps --entrypoint node), ya que openclaw-cli comparte el espacio de nombres de red del Gateway y solo funciona una vez que existe el contenedor del Gateway.
Abrir la Control UI
Abre http://127.0.0.1:18789/ y pega en Settings el token escrito en .env. Si cambiaste el contenedor a autenticación por contraseña, usa esa contraseña en su lugar.
¿Necesitas la URL otra vez?
docker compose run --rm openclaw-cli dashboard --no-openConfigurar canales (opcional)
# WhatsApp (QR)docker compose run --rm openclaw-cli channels login # Telegramdocker compose run --rm openclaw-cli channels add --channel telegram --token "<token>" # Discorddocker compose run --rm openclaw-cli channels add --channel discord --token "<token>"Flujo manual
docker build -t openclaw:local -f Dockerfile .docker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js onboard --mode local --no-install-daemondocker compose run --rm --no-deps --entrypoint node openclaw-gateway \ dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'docker compose up -d openclaw-gatewayVariables de entorno
Variables opcionales aceptadas por scripts/docker/setup.sh (y, para el contenedor del Gateway, directamente por docker-compose.yml):
| Variable | Propósito |
|---|---|
OPENCLAW_IMAGE |
Usar una imagen remota en lugar de compilar localmente |
OPENCLAW_IMAGE_APT_PACKAGES |
Instalar paquetes apt adicionales durante la compilación (separados por espacios). Alias heredado: OPENCLAW_DOCKER_APT_PACKAGES |
OPENCLAW_IMAGE_PIP_PACKAGES |
Instalar paquetes de Python adicionales durante la compilación (separados por espacios) |
OPENCLAW_EXTENSIONS |
Preinstalar dependencias de plugins en tiempo de compilación (ids separados por comas o espacios) |
OPENCLAW_DOCKER_BUILD_NODE_OPTIONS |
Sobrescribir las opciones de Node de compilación local desde código fuente (predeterminado --max-old-space-size=8192) |
OPENCLAW_DOCKER_BUILD_TSDOWN_MAX_OLD_SPACE_MB |
Sobrescribir el heap de tsdown de compilación local desde código fuente en MB |
OPENCLAW_DOCKER_BUILD_SKIP_DTS |
Omitir la salida de declaraciones durante compilaciones de imagen local solo para runtime (predeterminado 1) |
OPENCLAW_INSTALL_BROWSER |
Incorporar Chromium + Xvfb en la imagen en tiempo de compilación |
OPENCLAW_EXTRA_MOUNTS |
Montajes bind adicionales del host (separados por comas source:target[:opts]) |
OPENCLAW_HOME_VOLUME |
Persistir /home/node en un volumen Docker con nombre |
OPENCLAW_SANDBOX |
Optar por el arranque de sandbox (1, true, yes, on) |
OPENCLAW_SKIP_ONBOARDING |
Omitir el paso interactivo de onboarding (1, true, yes, on) |
OPENCLAW_DOCKER_SOCKET |
Sobrescribir la ruta del socket de Docker |
OPENCLAW_DISABLE_BONJOUR |
Forzar la publicidad Bonjour/mDNS activada (0) o desactivada (1); consulta Bonjour / mDNS |
OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS |
Desactivar superposiciones de montaje bind del código fuente de plugins incluidos |
OTEL_EXPORTER_OTLP_ENDPOINT |
Endpoint compartido del colector OTLP/HTTP para exportación de OpenTelemetry |
OTEL_EXPORTER_OTLP_*_ENDPOINT |
Endpoints OTLP específicos de señal para trazas, métricas o registros |
OTEL_EXPORTER_OTLP_PROTOCOL |
Sobrescritura del protocolo OTLP. Hoy solo se admite http/protobuf |
OTEL_SERVICE_NAME |
Nombre de servicio usado para recursos de OpenTelemetry |
OTEL_SEMCONV_STABILITY_OPT_IN |
Optar por los atributos semánticos experimentales más recientes de GenAI |
OPENCLAW_OTEL_PRELOADED |
Omitir el inicio de un segundo SDK de OpenTelemetry cuando ya hay uno precargado |
La imagen oficial no incluye Homebrew. Durante el onboarding, OpenClaw oculta instaladores de dependencias de Skills exclusivos de brew en un contenedor Linux sin brew; proporciona esas dependencias mediante una imagen personalizada o instálalas manualmente. Usa OPENCLAW_IMAGE_APT_PACKAGES para dependencias empaquetadas por Debian y OPENCLAW_IMAGE_PIP_PACKAGES para dependencias de Python (ejecuta python3 -m pip install --break-system-packages en tiempo de compilación, así que fija versiones y usa solo índices en los que confíes).
Si Docker informa ResourceExhausted, cannot allocate memory o se interrumpe durante tsdown, aumenta el límite de memoria del constructor de Docker o vuelve a intentarlo con heaps explícitos más pequeños:
OPENCLAW_DOCKER_BUILD_NODE_OPTIONS=--max-old-space-size=4096 OPENCLAW_DOCKER_BUILD_TSDOWN_MAX_OLD_SPACE_MB=4096Para probar el código fuente de un plugin incluido contra una imagen empaquetada, monta un directorio de código fuente de plugin sobre su ruta de código fuente empaquetada, por ejemplo, OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. Eso sobrescribe el paquete compilado correspondiente /app/dist/extensions/synology-chat para el mismo id de plugin.
Observabilidad
La exportación de OpenTelemetry es saliente desde el contenedor del Gateway hacia tu colector OTLP; no necesita ningún puerto Docker publicado. Para incluir el exportador incluido en una imagen compilada localmente:
export OPENCLAW_EXTENSIONS="diagnostics-otel"export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"export OTEL_SERVICE_NAME="openclaw-gateway"./scripts/docker/setup.shLas imágenes oficiales precompiladas ya incluyen diagnostics-otel; instala clawhub:@openclaw/diagnostics-otel tú mismo solo si lo eliminaste. Para habilitar la exportación, permite y habilita el plugin diagnostics-otel en la configuración y luego establece diagnostics.otel.enabled=true (consulta el ejemplo completo en Exportación de OpenTelemetry). Los encabezados de autenticación del colector van mediante diagnostics.otel.headers, no mediante variables de entorno de Docker.
Las métricas de Prometheus reutilizan el puerto del Gateway ya publicado. Instala clawhub:@openclaw/diagnostics-prometheus, habilita el plugin diagnostics-prometheus y luego recopila:
http://<gateway-host>:18789/api/diagnostics/prometheusLa ruta está protegida por la autenticación del Gateway; no expongas un puerto público /metrics separado ni una ruta de proxy inverso sin autenticación. Consulta Métricas de Prometheus.
Comprobaciones de estado
Endpoints de sondeo del contenedor (no requieren autenticación):
curl -fsS http://127.0.0.1:18789/healthz # livenesscurl -fsS http://127.0.0.1:18789/readyz # readinessEl HEALTHCHECK integrado de la imagen hace ping a /healthz; los fallos repetidos marcan el contenedor como unhealthy para que los orquestadores puedan reiniciarlo o reemplazarlo.
Instantánea profunda de estado autenticada:
docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"LAN frente a loopback
scripts/docker/setup.sh usa de forma predeterminada OPENCLAW_GATEWAY_BIND=lan para que http://127.0.0.1:18789 en el host funcione con la publicación de puertos de Docker.
lan(predeterminado): el navegador del host y la CLI del host pueden alcanzar el puerto publicado del gateway.loopback: solo los procesos dentro del espacio de nombres de red del contenedor pueden alcanzar el gateway directamente.
Proveedores locales del host
Dentro del contenedor, 127.0.0.1 es el propio contenedor, no el host. Usa host.docker.internal para proveedores que se ejecutan en el host:
| Proveedor | URL predeterminada del host | URL de configuración de Docker |
|---|---|---|
| LM Studio | http://127.0.0.1:1234 |
http://host.docker.internal:1234 |
| Ollama | http://127.0.0.1:11434 |
http://host.docker.internal:11434 |
La configuración incluida usa esas URL como valores predeterminados de incorporación para LM Studio/Ollama, y docker-compose.yml asigna host.docker.internal al gateway del host en Linux Docker Engine (Docker Desktop proporciona el mismo alias en macOS/Windows). Los servicios del host deben escuchar en una dirección que Docker pueda alcanzar:
lms server start --port 1234 --bind 0.0.0.0OLLAMA_HOST=0.0.0.0:11434 ollama serve¿Usas tu propio archivo Compose o docker run? Agrega tú mismo la misma asignación, por ejemplo --add-host=host.docker.internal:host-gateway.
Backend de Claude CLI en Docker
La imagen oficial no preinstala Claude Code. Instálalo e inicia sesión dentro del usuario node del contenedor, luego conserva ese home del contenedor para que las actualizaciones de imagen no borren el binario ni el estado de autenticación.
Para una instalación nueva, habilita un volumen persistente de /home/node antes de ejecutar la configuración:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"export OPENCLAW_HOME_VOLUME="openclaw_home"./scripts/docker/setup.shPara una instalación existente, detén la pila y vuelve a cargar primero los valores actuales de .env: el script de configuración siempre reescribe .env desde el shell actual y los valores predeterminados; no lee el archivo por sí solo:
set -a. ./.envset +aexport OPENCLAW_HOME_VOLUME="${OPENCLAW_HOME_VOLUME:-openclaw_home}"./scripts/docker/setup.shSi .env contiene valores que tu shell no puede cargar con source, vuelve a exportar manualmente primero aquello de lo que dependes (OPENCLAW_IMAGE, puertos, modo de enlace, rutas personalizadas, OPENCLAW_EXTRA_MOUNTS, sandbox, omitir incorporación). La superposición generada monta el volumen home tanto para openclaw-gateway como para openclaw-cli; ejecuta los comandos restantes con esa superposición (y docker-compose.override.yml primero, si usas uno):
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint sh openclaw-cli -lc \ 'curl -fsSL https://claude.ai/install.sh | bash'El instalador nativo escribe claude en /home/node/.local/bin/claude. Apunta OpenClaw a esa ruta:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli config set \ agents.defaults.cliBackends.claude-cli.command \ /home/node/.local/bin/claudeInicia sesión y verifica desde el mismo home persistente:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint /home/node/.local/bin/claude openclaw-cli auth logindocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ --entrypoint /home/node/.local/bin/claude openclaw-cli auth status --textdocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli models auth login \ --provider anthropic --method cli --set-defaultdocker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli models list --provider anthropicLuego usa el backend claude-cli incluido:
docker compose -f docker-compose.yml -f docker-compose.extra.yml run --rm \ openclaw-cli agent \ --agent main \ --model claude-cli/claude-sonnet-4-6 \ --message "Say hello from Docker Claude CLI"OPENCLAW_HOME_VOLUME conserva la instalación nativa en /home/node/.local/bin y /home/node/.local/share/claude, además de la configuración/autenticación de Claude Code en /home/node/.claude y /home/node/.claude.json. Conservar solo /home/node/.openclaw no es suficiente; si usas OPENCLAW_EXTRA_MOUNTS en lugar de un volumen home, monta todas esas rutas de Claude en ambos servicios.
Bonjour / mDNS
Las redes bridge de Docker normalmente no reenvían multicast Bonjour/mDNS (224.0.0.251:5353) de forma fiable. Cuando OPENCLAW_DISABLE_BONJOUR no está definido, el Plugin Bonjour incluido desactiva automáticamente la publicidad LAN una vez que detecta que se ejecuta en un contenedor, por lo que no entrará en un ciclo de fallos reintentando el multicast que el bridge descarta. Define OPENCLAW_DISABLE_BONJOUR=1 para forzarlo a desactivarse independientemente de la detección, o 0 para forzarlo a activarse (solo en redes del host, macvlan u otra red donde se sepa que el multicast mDNS funciona).
De lo contrario, usa la URL publicada del Gateway, Tailscale o DNS-SD de área amplia para hosts Docker. Consulta descubrimiento de Bonjour para ver problemas habituales y solución de problemas.
Almacenamiento y persistencia
Docker Compose monta mediante bind mount OPENCLAW_CONFIG_DIR en /home/node/.openclaw, OPENCLAW_WORKSPACE_DIR en /home/node/.openclaw/workspace y OPENCLAW_AUTH_PROFILE_SECRET_DIR en /home/node/.config/openclaw, por lo que esas rutas sobreviven al reemplazo del contenedor. Cuando una variable no está definida, docker-compose.yml usa una ruta alternativa bajo ${HOME}, o /tmp si falta el propio HOME, de modo que docker compose up nunca emite una especificación de volumen con origen vacío en entornos básicos.
Ese directorio de configuración montado contiene:
-
openclaw.jsonpara la configuración de comportamiento -
agents/<agentId>/agent/auth-profiles.jsonpara la autenticación OAuth/clave de API almacenada del proveedor -
.envpara secretos de runtime respaldados por env, comoOPENCLAW_GATEWAY_TOKENEl directorio secreto del perfil de autenticación almacena la clave de cifrado local para el material de tokens del perfil de autenticación respaldado por OAuth. Consérvalo con el estado de tu host Docker, pero separado de
OPENCLAW_CONFIG_DIR.Los plugins descargables instalados almacenan el estado del paquete bajo el directorio principal de OpenClaw montado, por lo que los registros de instalación y las raíces de los paquetes sobreviven al reemplazo del contenedor; el inicio del gateway no regenera los árboles de dependencias de plugins incluidos.
Para obtener detalles completos sobre la persistencia de la VM, consulta Tiempo de ejecución de VM Docker - Qué persiste y dónde.
Puntos críticos de crecimiento del disco:
media/, archivos JSONL de sesión, la base de datos SQLite de estado compartido, las raíces de paquetes de plugins instalados y los registros de archivo rotativos bajo/tmp/openclaw/.Ayudantes de shell (opcional)
Para comandos cotidianos más breves, instala ClawDock:
bash mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.shecho 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrcSi instalaste desde la ruta anterior
scripts/shell-helpers/clawdock-helpers.sh, vuelve a ejecutar el comando anterior para que tu ayudante local siga la ubicación actual. Luego usaclawdock-start,clawdock-stop,clawdock-dashboard, etc. (ejecutaclawdock-helppara ver la lista completa).
Habilitar el sandbox del agente para el gateway de Docker
export OPENCLAW_SANDBOX=1./scripts/docker/setup.shRuta de socket personalizada (por ejemplo, Docker sin root):
export OPENCLAW_SANDBOX=1export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock./scripts/docker/setup.shEl script monta docker.sock solo después de que se cumplan los requisitos previos del sandbox. Si la configuración del sandbox no puede completarse, restablece agents.defaults.sandbox.mode a off. El modo de código de Codex se deshabilita para los turnos en los que el sandbox de OpenClaw está activo (consulta Sandboxing § Backend de Docker); nunca montes el socket Docker del host en contenedores sandbox de agentes.
Automatización / CI (no interactivo)
Deshabilita la asignación de pseudo-TTY de Compose con -T:
docker compose run -T --rm openclaw-cli gateway probedocker compose run -T --rm openclaw-cli devices list --jsonNota de seguridad de red compartida
openclaw-cli usa network_mode: "service:openclaw-gateway" para que los comandos de la CLI puedan llegar al gateway mediante 127.0.0.1. Trátalo como un límite de confianza compartido. La configuración de compose descarta NET_RAW/NET_ADMIN y habilita no-new-privileges tanto en openclaw-gateway como en openclaw-cli.
Fallos de DNS de Docker Desktop en openclaw-cli
Algunas configuraciones de Docker Desktop fallan en las búsquedas DNS desde el contenedor auxiliar openclaw-cli de red compartida después de descartar NET_RAW, lo que aparece como EAI_AGAIN durante comandos respaldados por npm como openclaw plugins install. Mantén el archivo compose endurecido predeterminado para la operación normal. La anulación siguiente restaura las capacidades predeterminadas solo para el contenedor openclaw-cli; úsala para el comando puntual que necesita acceso al registro, no como invocación predeterminada:
printf '%s\n' \ 'services:' \ ' openclaw-cli:' \ ' cap_drop: !reset []' \ > docker-compose.cli-no-dropped-caps.local.yml docker compose -f docker-compose.yml -f docker-compose.cli-no-dropped-caps.local.yml run --rm openclaw-cli plugins install <package>Si ya creaste un contenedor openclaw-cli de larga duración, recréalo con la misma anulación; docker compose exec/docker exec no puede cambiar las capacidades de Linux en un contenedor ya creado.
Permisos y EACCES
La imagen se ejecuta como node (uid 1000). Si ves errores de permisos en /home/node/.openclaw, asegúrate de que los montajes bind del host sean propiedad del uid 1000:
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspaceLa misma discrepancia puede aparecer como blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root) seguido de plugin present but blocked: el uid del proceso y el propietario del directorio de plugins montado no coinciden. Prefiere ejecutar con el uid predeterminado 1000 y corregir la propiedad del montaje bind. Solo aplica chown a /path/to/openclaw-config/npm como root:root si tienes la intención de ejecutar OpenClaw como root a largo plazo.
Reconstrucciones más rápidas
Ordena tu Dockerfile para que las capas de dependencias se almacenen en caché, evitando volver a ejecutar pnpm install salvo que cambien los lockfiles:
FROM node:24-bookwormRUN curl -fsSL https://bun.sh/install | bashENV PATH="/root/.bun/bin:${PATH}"RUN corepack enableWORKDIR /appCOPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./COPY ui/package.json ./ui/package.jsonCOPY scripts ./scriptsRUN pnpm install --frozen-lockfileCOPY . .RUN pnpm buildRUN pnpm ui:installRUN pnpm ui:buildENV NODE_ENV=productionCMD ["node","dist/index.js"]Opciones de contenedor para usuarios avanzados
La imagen predeterminada prioriza la seguridad y se ejecuta como node no root. Para un contenedor con más funciones:
- Persistir
/home/node:export OPENCLAW_HOME_VOLUME="openclaw_home" - Incluir dependencias del sistema en la imagen:
export OPENCLAW_IMAGE_APT_PACKAGES="git curl jq" - Incluir dependencias de Python en la imagen:
export OPENCLAW_IMAGE_PIP_PACKAGES="requests==2.32.5 humanize==4.14.0" - Incluir Playwright Chromium en la imagen:
export OPENCLAW_INSTALL_BROWSER=1, o usa la etiqueta oficial de imagen-browser - O instalar navegadores de Playwright en un volumen persistente:
bash docker compose run --rm openclaw-cli \ node /app/node_modules/playwright-core/cli.js install chromium - Persistir descargas del navegador: usa
OPENCLAW_HOME_VOLUMEoOPENCLAW_EXTRA_MOUNTS. OpenClaw detecta automáticamente el Chromium gestionado por Playwright de la imagen en Linux.
OpenAI Codex OAuth (Docker sin interfaz)
Si eliges OpenAI Codex OAuth en el asistente, se abre una URL del navegador. En Docker o configuraciones sin interfaz, copia la URL de redirección completa a la que llegues y pégala de nuevo en el asistente para finalizar la autenticación.
Metadatos de imagen base
La imagen de runtime usa node:24-bookworm-slim y ejecuta tini como PID 1 para que los procesos zombi se recojan y las señales se gestionen correctamente en contenedores de larga duración. Publica anotaciones de imagen base OCI, incluidas org.opencontainers.image.base.name y org.opencontainers.image.source. Dependabot actualiza el digest base de Node fijado; las compilaciones de lanzamiento no ejecutan una capa separada de actualización de distribución. Consulta anotaciones de imagen OCI.
¿Ejecutar en un VPS?
Consulta Hetzner (Docker VPS) y Docker VM Runtime para ver los pasos de despliegue de VM compartida, incluido el horneado del binario, la persistencia y las actualizaciones.
Entorno aislado de agentes
Cuando agents.defaults.sandbox está habilitado con el backend de Docker, el Gateway ejecuta las herramientas del agente (shell, lectura/escritura de archivos, etc.) dentro de contenedores Docker aislados mientras el propio Gateway permanece en el host: una barrera rígida alrededor de sesiones de agente no confiables o multiinquilino sin contenerizar todo el Gateway.
El alcance del sandbox puede ser por agente (predeterminado), por sesión o compartido; cada alcance obtiene su propio workspace montado en /workspace. También puedes configurar políticas de herramientas de permitir/denegar, aislamiento de red, límites de recursos y contenedores de navegador.
Para la configuración completa, imágenes, notas de seguridad y perfiles multiagente:
- Sandboxing -- referencia completa del sandbox
- OpenShell -- acceso interactivo de shell a contenedores de sandbox
- Sandbox y herramientas multiagente -- anulaciones por agente
Activación rápida
{ agents: { defaults: { sandbox: { mode: "non-main", // off | non-main | all scope: "agent", // session | agent | shared }, }, },}Compila la imagen de sandbox predeterminada (desde un checkout de código fuente):
scripts/sandbox-setup.shPara instalaciones npm sin un checkout de código fuente, consulta Sandboxing § Imágenes y configuración para ver comandos docker build en línea.
Solución de problemas
Falta la imagen o el contenedor de sandbox no se inicia
Compila la imagen de sandbox con scripts/sandbox-setup.sh (checkout de código fuente), usa el comando docker build en línea de Sandboxing § Imágenes y configuración (instalación npm), o define agents.defaults.sandbox.docker.image con tu imagen personalizada. Los contenedores se crean automáticamente por sesión bajo demanda.
Errores de permisos en el sandbox
Define docker.user como un UID:GID que coincida con la propiedad de tu workspace montado, o cambia el propietario de la carpeta del workspace con chown.
No se encuentran herramientas personalizadas en el sandbox
OpenClaw ejecuta comandos con sh -lc (shell de inicio de sesión), que carga /etc/profile y puede restablecer PATH. Define docker.env.PATH para anteponer las rutas de tus herramientas personalizadas, o añade un script bajo /etc/profile.d/ en tu Dockerfile.
Proceso terminado por OOM durante la compilación de la imagen (salida 137)
La VM necesita al menos 2 GB de RAM. Usa una clase de máquina más grande y vuelve a intentarlo.
No autorizado o emparejamiento requerido en Control UI
Obtén un enlace de dashboard nuevo y aprueba el dispositivo del navegador:
docker compose run --rm openclaw-cli dashboard --no-opendocker compose run --rm openclaw-cli devices listdocker compose run --rm openclaw-cli devices approve <requestId>Más detalles: Dashboard, Dispositivos.
El destino del Gateway muestra ws://172.x.x.x o errores de emparejamiento desde Docker CLI
Restablece el modo y el enlace del Gateway:
docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789Relacionado
- Resumen de instalación — todos los métodos de instalación
- Podman — alternativa de Podman a Docker
- ClawDock — configuración comunitaria con Docker Compose
- Actualización — mantener OpenClaw actualizado
- Configuración — configuración del Gateway después de la instalación