Docker VM Runtime
Pasos de runtime compartidos para instalaciones Docker basadas en VM, como GCP, Hetzner y proveedores VPS similares.
Incluir binarios necesarios en la imagen
Instalar binarios dentro de un contenedor en ejecución es una trampa. Todo lo que se instale en runtime se perderá al reiniciar.
Todos los binarios externos que necesiten los skills deben instalarse en tiempo de compilación de la imagen.
Los ejemplos a continuación muestran solo tres binarios comunes:
gogpara acceso a Gmailgoplacespara Google Placeswaclipara WhatsApp
Estos son ejemplos, no una lista completa. Puedes instalar tantos binarios como necesites usando el mismo patrón.
Si más adelante agregas skills que dependen de binarios adicionales, debes:
- Actualizar el Dockerfile
- Recompilar la imagen
- Reiniciar los contenedores
Dockerfile de ejemplo
FROM node:24-bookworm
RUN apt-get update && apt-get install -y socat && rm -rf /var/lib/apt/lists/*
# Example binary 1: Gmail CLI
RUN curl -L https://github.com/steipete/gog/releases/latest/download/gog_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/gog
# Example binary 2: Google Places CLI
RUN curl -L https://github.com/steipete/goplaces/releases/latest/download/goplaces_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/goplaces
# Example binary 3: WhatsApp CLI
RUN curl -L https://github.com/steipete/wacli/releases/latest/download/wacli_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/wacli
# Add more binaries below using the same pattern
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN corepack enable
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"]
Compilar y lanzar
docker compose build
docker compose up -d openclaw-gateway
Si la compilación falla con Killed o exit code 137 durante pnpm install --frozen-lockfile, la VM no tiene suficiente memoria.
Usa una clase de máquina más grande antes de reintentar.
Verificar binarios:
docker compose exec openclaw-gateway which gog
docker compose exec openclaw-gateway which goplaces
docker compose exec openclaw-gateway which wacli
Salida esperada:
/usr/local/bin/gog
/usr/local/bin/goplaces
/usr/local/bin/wacli
Verificar el gateway:
docker compose logs -f openclaw-gateway
Salida esperada:
[gateway] listening on ws://0.0.0.0:18789
Qué persiste y dónde
OpenClaw se ejecuta en Docker, pero Docker no es la fuente de verdad. Todo el estado de larga duración debe sobrevivir a reinicios, recompilaciones y reboots.
| Componente | Ubicación | Mecanismo de persistencia | Notas |
|---|---|---|---|
| Config del gateway | /home/node/.openclaw/ | Volumen del host | Incluye openclaw.json, tokens |
| Perfiles de auth | /home/node/.openclaw/ | Volumen del host | Tokens OAuth, API keys |
| Configs de skills | /home/node/.openclaw/skills/ | Volumen del host | Estado a nivel de skill |
| Workspace del agente | /home/node/.openclaw/workspace/ | Volumen del host | Código y artefactos del agente |
| Sesión WhatsApp | /home/node/.openclaw/ | Volumen del host | Preserva login QR |
| Keyring Gmail | /home/node/.openclaw/ | Volumen del host + password | Requiere GOG_KEYRING_PASSWORD |
| Binarios externos | /usr/local/bin/ | Imagen Docker | Deben incluirse en compilación |
| Runtime Node | Filesystem del contenedor | Imagen Docker | Se recrea en cada compilación |
| Paquetes del SO | Filesystem del contenedor | Imagen Docker | No instalar en runtime |
| Contenedor Docker | Efímero | Reiniciable | Seguro de destruir |
Actualizaciones
Para actualizar OpenClaw en la VM:
git pull
docker compose build
docker compose up -d