# ========== 阶段1:构建环境 ========== FROM node:22-bookworm AS builder ENV LANG=zh_CN.UTF-8 \ LANGUAGE=zh_CN:zh \ LC_ALL=zh_CN.UTF-8 \ DEBIAN_FRONTEND=noninteractive # 安装构建依赖(包含编译工具和 Python 完整环境) 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/* # 创建 Python 虚拟环境并安装所需包 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 # 安装 Bun RUN curl -fsSL https://bun.sh/install | bash ENV BUN_INSTALL=/root/.bun ENV PATH="${BUN_INSTALL}/bin:${PATH}" # 安装 UV RUN curl -LsSf https://astral.sh/uv/install.sh | sh \ && mv /root/.local/bin/uv /usr/local/bin/uv # 安装 OpenClaw 核心到自定义目录(避免污染系统全局) RUN npm install --prefix /opt/openclaw -g openclaw@latest --unsafe-perm && npm cache clean --force # 安装 Playwright(指定版本,下载浏览器) 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 # ---------- 写入您的原始启动脚本 start-openclaw ---------- RUN echo '#!/bin/bash\n\ set -e\n\ # 默认环境变量填充\n\ export OPENAI_API_BASE="${OPENAI_API_BASE:-https://openrouter.ai/api/v1}"\n\ export OPENAI_API_KEY="${OPENAI_API_KEY:-sk-yourapikey}"\n\ export MODEL="${MODEL:-openrouter/free}"\n\ export PORT="${PORT:-18789}"\n\ \n\ mkdir -p /root/.openclaw\n\ \n\ \n\ # 处理 BaseUrl 格式\n\ CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")\n\ \n\ # 动态生成 openclaw.json\n\ cat < /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": "$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\ # 动态查找 playwright 的 chromium 路径并设置 CHROME_PATH(若未指定或不存在)\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 # ========== 阶段2:最终运行镜像 ========== FROM node:22-bookworm ENV LANG=zh_CN.UTF-8 \ LANGUAGE=zh_CN:zh \ LC_ALL=zh_CN.UTF-8 \ DEBIAN_FRONTEND=noninteractive # 安装运行时必需的库、locales 并生成中文环境 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/* # 从构建阶段复制 Python 虚拟环境 COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # 复制 Bun COPY --from=builder /root/.bun /root/.bun ENV BUN_INSTALL=/root/.bun ENV PATH="${BUN_INSTALL}/bin:${PATH}" # 复制 UV COPY --from=builder /usr/local/bin/uv /usr/local/bin/uv # 复制 OpenClaw(自定义安装目录)并添加到 PATH COPY --from=builder /opt/openclaw /opt/openclaw ENV PATH="/opt/openclaw/bin:${PATH}" # 复制 Playwright 浏览器 COPY --from=builder /root/.cache/ms-playwright /root/.cache/ms-playwright ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright # 不在这里设置 CHROME_PATH 静态值,由启动脚本动态查找 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"]