Sign inSign up

cnrock/openclaw

By cnrock

Updated 1 day ago

OpenClaw/Moltbot/Clawdbot - Playwright + Chromium automation bot with root access, multi-arch

Image
Machine learning & AI
0

10K+

cnrock/openclaw repository overview

Docker Stars Docker Pulls

OpenClaw Docker Image - Multi-Stage Build

This document provides an overview of the multi-stage Dockerfile used to build an optimized OpenClaw runtime environment. The image includes OpenClaw gateway, Python, Bun, UV, and Playwright for browser automation.


Dockerfile Content (with English comments)

Below is the full Dockerfile with all comments translated into English.

# ========== Stage 1: Build Environment ==========
FROM node:22-bookworm AS builder
LABEL maintainer="Wan Jie <[email protected]>" \
      version="2026.*.*" \
      description="OpenClaw Image,include PLAYWRIGHT, chromium,agent-browser with fonts-noto-cjk"

# Set locale to Chinese UTF-8 (required for some fonts and applications)
ENV LANG=zh_CN.UTF-8 \
    LANGUAGE=zh_CN:zh \
    LC_ALL=zh_CN.UTF-8 \
    DEBIAN_FRONTEND=noninteractive

# Install build dependencies (including compilation tools and full Python environment)
RUN apt-get update && apt-get install -y --no-install-recommends \
    git openssh-client build-essential python3-full python3-pip python3-venv \
    ca-certificates curl unzip \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 \
    libgbm1 libpango-1.0-0 libcairo2 libasound2 \
    fonts-noto-cjk fonts-noto-color-emoji locales \
    gnupg2 \
    && sed -i 's/^# \(zh_CN.UTF-8\)/\1/' /etc/locale.gen && locale-gen \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C || true \
    && rm -rf /var/lib/apt/lists/*

# Create Python virtual environment and install required packages
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir huggingface_hub jupyterlab \
    && pip cache purge

# Install Bun
RUN curl -fsSL https://bun.sh/install | bash
ENV BUN_INSTALL=/root/.bun
ENV PATH="${BUN_INSTALL}/bin:${PATH}"

# Install UV
RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
    && mv /root/.local/bin/uv /usr/local/bin/uv

# Install OpenClaw core to a custom directory (avoid polluting global system)
RUN npm install --prefix /opt/openclaw -g openclaw@latest --unsafe-perm && npm cache clean --force

# Install Playwright (specific version, download browser)
ARG PLAYWRIGHT_VERSION=1.50.1
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@latest --activate \
    && printf '{"name":"openclaw-app","private":true}' > package.json \
    && pnpm add -D playwright@${PLAYWRIGHT_VERSION} \
    && pnpm exec playwright install chromium \
    && pnpm store prune


# ---------- Write the original start-openclaw script ----------
RUN echo '#!/bin/bash\n\
set -e\n\
# Default environment variable values\n\
export OPENAI_API_BASE="${OPENAI_API_BASE:-https://api.openai.com/v1}"\n\
export OPENAI_API_KEY="${OPENAI_API_KEY:-sk-placeholder}"\n\
export MODEL="${MODEL:-openrouter/free:free}"\n\
export PORT="${PORT:-18789}"\n\
\n\
mkdir -p /root/.openclaw/sessions /root/.openclaw/agents/main/sessions\n\
\n\

# Clean up BaseUrl format\n\
CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")\n\
\n\
# Dynamically generate openclaw.json\n\
cat <<EOF > /root/.openclaw/openclaw.json\n\
{\n\
  "models": {\n\
    "providers": {\n\
      "nvidia": {\n\
        "baseUrl": "$CLEAN_BASE",\n\
        "apiKey": "$OPENAI_API_KEY",\n\
        "api": "openai-completions",\n\
        "models": [{ "id": "$MODEL", "name": "PrimaryModel", "contextWindow": 128000 }]\n\
      }\n\
    }\n\
  },\n\
  "agents": { "defaults": { "model": { "primary": "nvidia/$MODEL" } } },\n\
  "gateway": {\n\
    "mode": "local", "bind": "lan", "port": $PORT,\n\
    "trustedProxies": ["0.0.0.0/0", "10.0.0.0/8", "172.16.0.0/12", "10.233.64.0/18", "100.64.0.0/10", "127.0.0.1/8"],\n\
    "auth": { "mode": "token" },\n\
    "controlUi": { "enabled": true, "dangerouslyAllowHostHeaderOriginFallback": true, "allowInsecureAuth": true, "dangerouslyDisableDeviceAuth": true}\n\
  }\n\
}\n\
EOF\n\
\n\

# Dynamically find the Chromium path from playwright and set CHROME_PATH (if not specified or missing)\n\
if [ ! -f "$CHROME_PATH" ]; then\n\
    CHROME_PATH=$(find /root/.cache/ms-playwright -name chrome -type f 2>/dev/null | head -1)\n\
    export CHROME_PATH\n\
fi\n\
\n\
openclaw doctor --fix || true\n\
echo "🚀 Starting OpenClaw on port $PORT..."\n\
exec openclaw gateway run --port $PORT\n\
' > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw

# ========== Stage 2: Final Runtime Image ==========
FROM node:22-bookworm-slim

# Set locale to Chinese UTF-8
ENV LANG=zh_CN.UTF-8 \
    LANGUAGE=zh_CN:zh \
    LC_ALL=zh_CN.UTF-8 \
    DEBIAN_FRONTEND=noninteractive

# Install runtime essential libraries, locales and generate Chinese environment
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates curl \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
    libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 \
    libgbm1 libpango-1.0-0 libcairo2 libasound2 \
    fonts-noto-cjk fonts-noto-color-emoji \
    python3-minimal python3-venv \
    locales \
    && sed -i 's/^# \(zh_CN.UTF-8\)/\1/' /etc/locale.gen \
    && locale-gen \
    && rm -rf /var/lib/apt/lists/*

# Copy Python virtual environment from builder stage
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# Copy Bun
COPY --from=builder /root/.bun /root/.bun
ENV BUN_INSTALL=/root/.bun
ENV PATH="${BUN_INSTALL}/bin:${PATH}"

# Copy UV
COPY --from=builder /usr/local/bin/uv /usr/local/bin/uv

# Copy OpenClaw (custom installation directory) and add to PATH
COPY --from=builder /opt/openclaw /opt/openclaw
ENV PATH="/opt/openclaw/bin:${PATH}"

# Copy Playwright browsers
COPY --from=builder /root/.cache/ms-playwright /root/.cache/ms-playwright
ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
# CHROME_PATH is not set statically here; it will be dynamically located by the startup script

# Copy the original scripts
COPY --from=builder /usr/local/bin/start-openclaw /usr/local/bin/start-openclaw

WORKDIR /app

ARG PORT=18789
ENV PORT=${PORT}
EXPOSE ${PORT}

CMD ["/usr/local/bin/start-openclaw"]

Key Features

  • Multi-stage build: Keeps final image slim by separating build dependencies from runtime.
  • Python virtual environment: Isolates Python packages (huggingface_hub, jupyterlab) from system Python.
  • OpenClaw installation: Installed into /opt/openclaw to avoid global npm pollution.
  • Playwright bundled: Chromium browser is pre-downloaded and cached for headless browsing.
  • Dynamic configuration: The startup script generates openclaw.json based on environment variables (OPENAI_API_BASE, OPENAI_API_KEY, MODEL, PORT).
  • Browser path detection: Automatically locates the Playwright Chromium binary if CHROME_PATH is not set.

Environment Variables

VariableDescriptionDefault
OPENAI_API_BASEBase URL for OpenAI-compatible APIhttps://api.openai.com/v1
OPENAI_API_KEYAPI key for the providersk-placeholder
MODELModel ID to use (e.g., openrouter/free:free)openrouter/free:free
PORTPort for OpenClaw gateway18789
HF_TOKENHugging Face token for authentication(optional)

Usage Example

Build the image:

docker build -t openclaw-image .

Run the container:

docker run -p 18789:18789 \
  -e OPENAI_API_BASE="https://your-custom-endpoint/v1" \
  -e OPENAI_API_KEY="your-api-key" \
  -e MODEL="your-model-id" \
  cnrock/openclaw

The OpenClaw gateway will be available on port 18789.


Notes

  • The image includes Chinese locale and fonts for CJK language support; this can be adjusted by removing locale-related lines if not needed.
  • Playwright browsers are stored in /root/.cache/ms-playwright and consumed by OpenClaw for web automation tasks.

Tag summary

Content type

Image

Digest

sha256:9fee05700

Size

956.9 MB

Last updated

3 months ago

docker pull cnrock/openclaw