Spaces:
Runtime error
Runtime error
| # ========== 阶段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 <<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": "$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"] |