hake89/openclaw-cf2
0
1# OpenClaw on Hugging Face Spaces — 优化构建(v2)2# 优化点:node 用户构建(消除 chown)、合并 RUN 层(减少层开销)3FROM node:22-bookworm4SHELL ["/bin/bash", "-c"]5 6# ── Layer 1 (root): 系统依赖 + 工具(全部合并为一层)─────────────────────────7RUN echo "[build][layer1] System deps + tools..." && START=$(date +%s) \8 && apt-get update \9 && apt-get install -y --no-install-recommends git ca-certificates curl python3 python3-pip patch \10 && rm -rf /var/lib/apt/lists/* \11 && pip3 install --no-cache-dir --break-system-packages huggingface_hub \12 && corepack enable \13 && mkdir -p /app \14 && chown node:node /app \15 && mkdir -p /home/node/.openclaw/workspace /home/node/.openclaw/credentials \16 && chown -R node:node /home/node \17 && echo "[build][layer1] System deps + tools: $(($(date +%s) - START))s"18 19# ── 切换到 node 用户(后续所有操作都以 node 身份,无需 chown)───────────────20USER node21ENV HOME=/home/node22WORKDIR /app23 24# ── Layer 2 (node): Clone + Patch + Install + Build(合并为一层)─────────────25COPY --chown=node:node patches /app/patches26RUN echo "[build][layer2] Clone + install + build..." && START=$(date +%s) \27 && git clone --depth 1 https://github.com/openclaw/openclaw.git openclaw \28 && echo "[build] git clone: $(($(date +%s) - START))s" \29 && cd openclaw \30 && for p in /app/patches/*.patch; do \31 if [ -f "$p" ]; then \32 patch -p1 < "$p" \33 && echo "[build] patch applied: $(basename $p)"; \34 fi; \35 done \36 && T1=$(date +%s) \37 && pnpm install --frozen-lockfile \38 && echo "[build] pnpm install: $(($(date +%s) - T1))s" \39 && T2=$(date +%s) \40 && pnpm build \41 && echo "[build] pnpm build: $(($(date +%s) - T2))s" \42 && T3=$(date +%s) \43 && OPENCLAW_PREFER_PNPM=1 pnpm ui:build \44 && echo "[build] pnpm ui:build: $(($(date +%s) - T3))s" \45 && test -f dist/entry.js && echo "[build] OK dist/entry.js" \46 && test -f dist/plugin-sdk/index.js && echo "[build] OK dist/plugin-sdk/index.js" \47 && test -d extensions/telegram && echo "[build] OK extensions/telegram" \48 && test -d extensions/whatsapp && echo "[build] OK extensions/whatsapp" \49 && test -d dist/control-ui && echo "[build] OK dist/control-ui" \50 && mkdir -p /app/openclaw/empty-bundled-plugins \51 && node -e "console.log(require('./package.json').version)" > /app/openclaw/.version \52 && echo "[build] version: $(cat /app/openclaw/.version)" \53 && echo "[build][layer2] Total clone+install+build: $(($(date +%s) - START))s"54 55# ── Layer 3 (node): Scripts + Config ──────────────────────────────────────────56COPY --chown=node:node scripts /home/node/scripts57COPY --chown=node:node openclaw.json /home/node/scripts/openclaw.json.default58RUN chmod +x /home/node/scripts/entrypoint.sh /home/node/scripts/sync_hf.py59 60ENV NODE_ENV=production61ENV OPENCLAW_BUNDLED_PLUGINS_DIR=/app/openclaw/empty-bundled-plugins62ENV OPENCLAW_PREFER_PNPM=163ENV PATH="/home/node/.local/bin:$PATH"64WORKDIR /home/node65 66CMD ["/home/node/scripts/entrypoint.sh"]67 