# 使用 Node.js 22 (Debian Bullseye) FROM node:22-bullseye # 1. 补全浏览器、SSH、时区及 Python 编译工具 # - DEBIAN_FRONTEND=noninteractive: 防止 tzdata 等安装时由于交互式提示挂起 # - chromium: 系统级内核,其路径 /usr/bin/chromium 可被 OpenClaw 自动识别 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ git \ cmake \ python3 \ python3-pip \ python3-setuptools \ python3-wheel \ lsof \ build-essential \ openssh-client \ tzdata \ chromium \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libasound2 \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libx11-xcb1 \ libxcb1 \ libglib2.0-0 \ libgtk-3-0 \ fonts-liberation \ fonts-noto-color-emoji \ libxss1 \ xvfb \ && rm -rf /var/lib/apt/lists/* # 2. 锁定 pnpm 版本确保构建一致性 RUN corepack enable && corepack prepare pnpm@9.0.0 --activate # 3. 环境变量 (自适应 Python 路径,去除硬编码版本号) # - DISPLAY=:99 配合 xvfb 使用,为浏览器提供虚拟屏幕,解决 X11 Missing 问题 # - XDG_RUNTIME_DIR 消除 Chrome 启动时的目录缺失警告 ENV TZ=Asia/Shanghai \ DISPLAY=:99 \ XDG_RUNTIME_DIR=/tmp/runtime-openclaw \ SKIP_DOWNLOAD_LLAMA_CPP_BINARIES=1 \ NODE_LLAMA_CPP_SKIP_DOWNLOAD=1 \ PYTHONUSERBASE=/app/.local \ OPENCLAW_STATE_DIR=/app/.openclaw \ PATH="/app/.local/bin:${PATH}" # 4. 目录预设与权限 (使用 node 用户对齐标准 Shell 环境) RUN mkdir -p /home/node/.ssh && \ chmod 700 /home/node/.ssh && \ chown -R node:node /home/node WORKDIR /app # 5. 代码拉取及权限同步 RUN git clone https://github.com/superxuu/HF_clawbot.git . && \ mkdir -p /app/.openclaw && \ chown -R node:node /app # 切换到非 root 用户 (node) USER node # 6. 使用 --user 安装以确保 AI 运行时路径兼容 RUN pip3 install --no-cache-dir --user paramiko fabric # 7. 构建流程 (驱动重定向与环境适配已并入代码,此处仅负责编译) RUN pnpm install --no-frozen-lockfile RUN pnpm store prune RUN pnpm build RUN pnpm ui:build EXPOSE 7860 # 关键环境变量:设置生产环境与端口 ENV NODE_ENV=production PORT=7860 # 8. 启动 (使用 xvfb-run 包装启动,为浏览器提供活动的虚拟 X Server 环境) CMD ["sh", "-c", "export OPENCLAW_GATEWAY_PORT=${PORT:-7860}; xvfb-run -a node scripts/run-node.mjs gateway --port ${PORT:-7860} --force --allow-unconfigured"]