Containers
Docker
Docker es opcional. Úsalo solo si quieres un Gateway en contenedor o validar el flujo de Docker.
¿Docker es adecuado para mí?
- Sí: quieres un entorno de Gateway aislado y desechable, o ejecutar OpenClaw en un host sin instalaciones locales.
- No: estás ejecutando en tu propia máquina y solo quieres el ciclo de desarrollo más rápido. Usa el flujo de instalación normal en su lugar.
- Nota sobre sandboxing: el backend de sandbox predeterminado usa Docker cuando el sandboxing está habilitado, pero el sandboxing está desactivado de forma predeterminada y no requiere que todo el Gateway se ejecute en Docker. Los backends de sandbox SSH y OpenShell también están disponibles. Consulta Sandboxing.
Requisitos previos
- Docker Desktop (o Docker Engine) + Docker Compose v2
- Al menos 2 GB de RAM para compilar la imagen (
pnpm installpuede terminarse por OOM en hosts de 1 GB con salida 137) - Espacio suficiente en disco para imágenes y logs
- Si se ejecuta en un VPS/host público, revisa
Endurecimiento de seguridad para exposición de red,
especialmente la política de firewall
DOCKER-USERde Docker.
Gateway en contenedor
Compilar la imagen
Desde la raíz del repo, ejecuta el script de configuración:
./scripts/docker/setup.sh
Esto compila la imagen del Gateway localmente. Para usar una imagen precompilada en su lugar:
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
./scripts/docker/setup.sh
Las imágenes precompiladas se publican en el
GitHub Container Registry.
Etiquetas comunes: main, latest, <version> (p. ej., 2026.2.26).
Completar la incorporación
El script de configuración ejecuta la incorporación automáticamente. Hará lo siguiente:
- solicitar claves de API del proveedor
- generar un token de Gateway y escribirlo en
.env - iniciar el Gateway mediante Docker Compose
Durante la configuración, la incorporación previa al inicio y las escrituras de configuración se ejecutan a través de
openclaw-gateway directamente. openclaw-cli es para los comandos que ejecutas después de
que el contenedor del Gateway ya existe.
Abrir la Control UI
Abre http://127.0.0.1:18789/ en tu navegador y pega el secreto compartido
configurado en Settings. El script de configuración escribe un token en .env de forma
predeterminada; si cambias la configuración del contenedor a autenticación por contraseña, usa esa
contraseña en su lugar.
¿Necesitas la URL de nuevo?
docker compose run --rm openclaw-cli dashboard --no-open
Configurar canales (opcional)
Usa el contenedor CLI para agregar canales de mensajería:
# WhatsApp (QR)
docker compose run --rm openclaw-cli channels login
# Telegram
docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"
# Discord
docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"
Flujo manual
Si prefieres ejecutar cada paso tú mismo en vez de usar el script de configuración:
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-daemon
docker 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-gateway
Variables de entorno
El script de configuración acepta estas variables de entorno opcionales:
| Variable | Propósito |
|---|---|
OPENCLAW_IMAGE |
Usar una imagen remota en vez de compilar localmente |
OPENCLAW_DOCKER_APT_PACKAGES |
Instalar paquetes apt adicionales durante la compilación (separados por espacios) |
OPENCLAW_EXTENSIONS |
Incluir helpers de plugins incluidos seleccionados 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 de Docker con nombre |
OPENCLAW_SANDBOX |
Optar por el bootstrap del sandbox (1, true, yes, on) |
OPENCLAW_SKIP_ONBOARDING |
Omitir el paso interactivo de incorporación (1, true, yes, on) |
OPENCLAW_DOCKER_SOCKET |
Sobrescribir la ruta del socket de Docker |
OPENCLAW_DISABLE_BONJOUR |
Desactivar anuncios Bonjour/mDNS (valor predeterminado 1 para Docker) |
OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS |
Desactivar overlays de montaje bind de 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 logs |
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 GenAI experimentales más recientes |
OPENCLAW_OTEL_PRELOADED |
Omitir el inicio de un segundo SDK de OpenTelemetry cuando ya hay uno precargado |
Los mantenedores pueden probar el código fuente de plugins incluidos contra una imagen empaquetada montando
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.
Ese directorio de código fuente montado sobrescribe el bundle compilado correspondiente
/app/dist/extensions/synology-chat para el mismo id de plugin.
Observabilidad
La exportación de OpenTelemetry sale desde el contenedor del Gateway hacia tu colector OTLP. No requiere un puerto Docker publicado. Si compilas la imagen localmente y quieres que el exportador de OpenTelemetry incluido esté disponible dentro de la imagen, incluye sus dependencias de runtime:
export OPENCLAW_EXTENSIONS="diagnostics-otel"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
export OTEL_SERVICE_NAME="openclaw-gateway"
./scripts/docker/setup.sh
Instala el plugin oficial @openclaw/diagnostics-otel desde ClawHub en
instalaciones Docker empaquetadas antes de habilitar la exportación. Las imágenes personalizadas compiladas desde código fuente aún pueden
incluir el código fuente del plugin local con
OPENCLAW_EXTENSIONS=diagnostics-otel. Para habilitar la exportación, permite y habilita el
plugin diagnostics-otel en la configuración, luego establece
diagnostics.otel.enabled=true o usa el ejemplo de configuración en Exportación de OpenTelemetry
. Los encabezados de autenticación del colector se configuran mediante
diagnostics.otel.headers, no mediante variables de entorno de Docker.
Las métricas de Prometheus usan el puerto del Gateway ya publicado. Instala
clawhub:@openclaw/diagnostics-prometheus, habilita el
plugin diagnostics-prometheus y luego realiza el scrape:
http://<gateway-host>:18789/api/diagnostics/prometheus
La 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 # liveness
curl -fsS http://127.0.0.1:18789/readyz # readiness
La imagen de Docker incluye un HEALTHCHECK integrado que hace ping a /healthz.
Si las comprobaciones siguen fallando, Docker marca el contenedor como unhealthy y
los sistemas de orquestación pueden 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 establece de forma predeterminada OPENCLAW_GATEWAY_BIND=lan para que el acceso del host a
http://127.0.0.1:18789 funcione con la publicación de puertos de Docker.
lan(predeterminado): el navegador del host y la CLI del host pueden acceder al puerto publicado del Gateway.loopback: solo los procesos dentro del espacio de nombres de red del contenedor pueden acceder directamente al Gateway.
Proveedores locales del host
Cuando OpenClaw se ejecuta en Docker, 127.0.0.1 dentro del contenedor es el propio
contenedor, no tu máquina host. Usa host.docker.internal para proveedores de IA 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 Docker incluida usa esas URL del host como valores predeterminados de incorporación de LM Studio y Ollama,
y docker-compose.yml asigna host.docker.internal al
Gateway del host de Docker para Docker Engine en Linux. Docker Desktop ya proporciona
el mismo nombre de host en macOS y Windows.
Los servicios del host también deben escuchar en una dirección accesible desde Docker:
lms server start --port 1234 --bind 0.0.0.0
OLLAMA_HOST=0.0.0.0:11434 ollama serve
Si usas tu propio archivo Compose o comando docker run, agrega tú mismo el mismo mapeo
de host, por ejemplo
--add-host=host.docker.internal:host-gateway.
Bonjour / mDNS
Las redes bridge de Docker normalmente no reenvían multicast Bonjour/mDNS
(224.0.0.251:5353) de forma fiable. Por eso, la configuración Compose incluida establece de forma predeterminada
OPENCLAW_DISABLE_BONJOUR=1 para que el Gateway no entre en un bucle de fallos ni reinicie
repetidamente los anuncios cuando el bridge descarta el tráfico multicast.
Usa la URL publicada del Gateway, Tailscale o DNS-SD de área amplia para hosts Docker.
Establece OPENCLAW_DISABLE_BONJOUR=0 solo cuando ejecutes con redes de host, macvlan
u otra red donde se sepa que el multicast mDNS funciona.
Para problemas comunes y solución de problemas, consulta Descubrimiento Bonjour.
Almacenamiento y persistencia
Docker Compose monta con bind OPENCLAW_CONFIG_DIR en /home/node/.openclaw y
OPENCLAW_WORKSPACE_DIR en /home/node/.openclaw/workspace, por lo que esas rutas
sobreviven al reemplazo del contenedor. Cuando alguna variable no está establecida, el
docker-compose.yml incluido recurre a ${HOME}/.openclaw (y
${HOME}/.openclaw/workspace para el montaje del workspace), o a /tmp/.openclaw
cuando también falta HOME. Eso evita que docker compose up emita
una especificación de volumen con origen vacío en entornos básicos.
Ese directorio de configuración montado es donde OpenClaw mantiene:
openclaw.jsonpara la configuración de comportamientoagents/<agentId>/agent/auth-profiles.jsonpara autenticación OAuth/API-key de proveedores almacenada.envpara secretos de runtime respaldados por entorno, comoOPENCLAW_GATEWAY_TOKEN
Los plugins descargables instalados almacenan su estado de paquete bajo el home de OpenClaw montado, por lo que los registros de instalación de plugins y las raíces de paquetes sobreviven al reemplazo del contenedor. El inicio del Gateway no genera árboles de dependencias de plugins incluidos.
Para detalles completos de persistencia en despliegues de VM, consulta Docker VM Runtime: qué persiste y dónde.
Puntos críticos de crecimiento del disco: vigila media/, los archivos JSONL de sesión,
cron/runs/*.jsonl, las raíces de paquetes de plugins instalados y los registros de archivo rotativos
bajo /tmp/openclaw/.
Ayudantes de shell (opcional)
Para una gestión diaria de Docker más sencilla, instala ClawDock:
mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.sh
echo 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc
Si instalaste ClawDock desde la ruta sin procesar anterior scripts/shell-helpers/clawdock-helpers.sh, vuelve a ejecutar el comando de instalación anterior para que tu archivo auxiliar local siga la nueva ubicación.
Luego usa clawdock-start, clawdock-stop, clawdock-dashboard, etc. Ejecuta
clawdock-help para ver todos los comandos.
Consulta ClawDock para ver la guía completa de ayudantes.
Habilitar el entorno aislado de agente para Docker Gateway
export OPENCLAW_SANDBOX=1
./scripts/docker/setup.sh
Ruta de socket personalizada (por ejemplo, Docker sin root):
export OPENCLAW_SANDBOX=1
export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock
./scripts/docker/setup.sh
El script monta docker.sock solo después de que se cumplan los requisitos previos del entorno aislado. Si
la configuración del entorno aislado no puede completarse, el script restablece agents.defaults.sandbox.mode
a off.
Automatización / CI (no interactivo)
Deshabilita la asignación de pseudo-TTY de Compose con -T:
docker compose run -T --rm openclaw-cli gateway probe
docker compose run -T --rm openclaw-cli devices list --json
Nota de seguridad de red compartida
openclaw-cli usa network_mode: "service:openclaw-gateway" para que los comandos de la CLI
puedan llegar al Gateway a través de 127.0.0.1. Trata esto 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.
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 de tu host pertenezcan al uid 1000:
sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace
La misma discrepancia puede aparecer como una advertencia de Plugin como
blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root)
seguida de plugin present but blocked. Eso significa que el uid del proceso y el
propietario del directorio del Plugin montado no coinciden. Es preferible ejecutar el contenedor con el
uid predeterminado 1000 y corregir la propiedad del montaje bind. Solo haz chown de
/path/to/openclaw-config/npm a root:root si ejecutas intencionalmente
OpenClaw como root a largo plazo.
Reconstrucciones más rápidas
Ordena tu Dockerfile para que las capas de dependencias queden en caché. Esto evita volver a ejecutar
pnpm install salvo que cambien los lockfiles:
FROM node:24-bookworm
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"
RUN corepack enable
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
Opciones de contenedor para usuarios avanzados
La imagen predeterminada prioriza la seguridad y se ejecuta como node sin root. Para un contenedor con más
funciones:
- Persistir
/home/node:export OPENCLAW_HOME_VOLUME="openclaw_home" - Incluir dependencias del sistema:
export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq" - Instalar navegadores de Playwright:
docker compose run --rm openclaw-cli \ node /app/node_modules/playwright-core/cli.js install chromium - Persistir descargas de navegadores: establece
PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwrighty usaOPENCLAW_HOME_VOLUMEuOPENCLAW_EXTRA_MOUNTS.
OAuth de OpenAI Codex (Docker sin interfaz)
Si eliges OAuth de OpenAI Codex 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 llegas y pégala de vuelta en el asistente para finalizar la autenticación.
Metadatos de imagen base
La imagen principal de runtime de Docker usa node:24-bookworm-slim y publica anotaciones OCI
de imagen base, incluidas org.opencontainers.image.base.name,
org.opencontainers.image.source y otras. El resumen de la base de Node se
actualiza mediante PR de imagen base de Docker de Dependabot; las compilaciones de lanzamiento no ejecutan
una capa de actualización de distro. Consulta
Anotaciones de imagen OCI.
¿Ejecutarlo en un VPS?
Consulta Hetzner (Docker VPS) y Docker VM Runtime para ver los pasos de despliegue en VM compartida, incluida la incorporación de binarios, la persistencia y las actualizaciones.
Entorno aislado de agente
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. Esto te da una barrera firme
alrededor de sesiones de agente no confiables o multiinquilino sin contenerizar todo el
Gateway.
El alcance del entorno aislado puede ser por agente (predeterminado), por sesión o compartido. Cada alcance
obtiene su propio espacio de trabajo 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, consulta:
- Entorno aislado -- referencia completa del entorno aislado
- OpenShell -- acceso interactivo de shell a contenedores del entorno aislado
- Entorno aislado y herramientas multiagente -- anulaciones por agente
Habilitación rápida
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off | non-main | all
scope: "agent", // session | agent | shared
},
},
},
}
Compila la imagen predeterminada del entorno aislado (desde un checkout de origen):
scripts/sandbox-setup.sh
Para instalaciones npm sin un checkout de origen, consulta Entorno aislado § Imágenes y configuración para ver comandos docker build en línea.
Solución de problemas
Falta la imagen o el contenedor del entorno aislado no arranca
Compila la imagen del entorno aislado con
scripts/sandbox-setup.sh
(checkout de origen) o el comando docker build en línea de Entorno aislado § Imágenes y configuración (instalación npm),
o establece agents.defaults.sandbox.docker.image en tu imagen personalizada.
Los contenedores se crean automáticamente por sesión bajo demanda.
Errores de permisos en el entorno aislado
Establece docker.user en un UID:GID que coincida con la propiedad de tu espacio de trabajo montado,
o cambia la propiedad de la carpeta del espacio de trabajo con chown.
Herramientas personalizadas no encontradas en el entorno aislado
OpenClaw ejecuta comandos con sh -lc (shell de inicio de sesión), que carga
/etc/profile y puede restablecer PATH. Establece docker.env.PATH para anteponer tus
rutas de herramientas personalizadas, o agrega un script bajo /etc/profile.d/ en tu Dockerfile.
Finalizado por OOM durante la compilación de 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 se requiere emparejamiento en Control UI
Obtén un enlace de panel actualizado y aprueba el dispositivo del navegador:
docker compose run --rm openclaw-cli dashboard --no-open
docker compose run --rm openclaw-cli devices list
docker compose run --rm openclaw-cli devices approve <requestId>
Más detalle: Panel, Dispositivos.
El destino del Gateway muestra ws://172.x.x.x o errores de emparejamiento desde la CLI de Docker
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:18789
Relacionado
- Resumen de instalación — todos los métodos de instalación
- Podman — alternativa de Podman a Docker
- ClawDock — configuración comunitaria de Docker Compose
- Actualización — mantener OpenClaw actualizado
- Configuración — configuración del Gateway después de la instalación