Spaces:
Paused
Paused
File size: 4,445 Bytes
c30380c c6e3458 b19d31a 0d9d280 b19d31a c6e3458 ef2eccf 3d1f951 0d9d280 594f943 0d9d280 c6e3458 ef2eccf c6e3458 9d3acbc d653b4e c6e3458 b19d31a ef2eccf b19d31a c6e3458 8ee58f9 c6e3458 b44dfca 9d3acbc c6e3458 8ee58f9 c6e3458 0d9d280 c0338ad b44dfca ef2eccf c0338ad 0d9d280 b19d31a ef2eccf b19d31a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | # OpenClaw on Hugging Face Spaces β Pre-built image (v4.1)
# Uses official pre-built image to avoid 30+ minute builds on cpu-basic
# ββ Stage 1: Pull pre-built OpenClaw βββββββββββββββββββββββββββββββββββββββββ
FROM ghcr.io/openclaw/openclaw:latest AS openclaw-prebuilt
# ββ Stage 2: Runtime βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
FROM node:22-bookworm
SHELL ["/bin/bash", "-c"]
# ββ System dependencies (root) βββββββββββββββββββββββββββββββββββββββββββββββ
RUN echo "[build] Installing system deps..." && START=$(date +%s) \
&& apt-get update \
&& apt-get install -y --no-install-recommends git ca-certificates curl python3 python3-pip cron \
&& rm -rf /var/lib/apt/lists/* \
&& pip3 install --no-cache-dir --break-system-packages huggingface_hub requests \
&& corepack enable \
&& mkdir -p /app/openclaw \
&& chown -R node:node /app \
&& mkdir -p /home/node/.openclaw/workspace /home/node/.openclaw/credentials \
&& chown -R node:node /home/node \
&& echo "[build] System deps: $(($(date +%s) - START))s"
# ββ Claude Code CLI + ACP (acpx) ββββββββββββββββββββββββββββββββββββββββββββββ
# Claude Code is the coding agent; acpx manages it via ACP (Agent Client Protocol)
RUN echo "[build] Installing Claude Code CLI + acpx..." && START=$(date +%s) \
&& npm install -g @anthropic-ai/claude-code acpx@latest \
&& echo "[build] Claude Code + acpx: $(($(date +%s) - START))s"
# ββ Copy pre-built OpenClaw (skips clone + install + build entirely) βββββββββ
COPY --from=openclaw-prebuilt --chown=node:node /app /app/openclaw
USER node
ENV HOME=/home/node
WORKDIR /app
# ββ A2A Gateway Extension βββββββββββββββββββββββββββββββββββββββββββββββββββ
RUN echo "[build] Installing A2A gateway..." && START=$(date +%s) \
&& git clone --depth 1 https://github.com/win4r/openclaw-a2a-gateway.git /app/openclaw/extensions/a2a-gateway \
&& cd /app/openclaw/extensions/a2a-gateway \
&& npm install --production \
&& echo "[build] A2A gateway: $(($(date +%s) - START))s"
# ββ Coding Agent Extension (local β no git clone needed) βββββββββββββββββββββ
COPY --chown=node:node extensions/coding-agent /app/openclaw/extensions/coding-agent
# ββ Pre-configure acpx for non-interactive ACP sessions βββββββββββββββββββ
RUN mkdir -p /home/node/.acpx \
&& echo '{"defaultAgent":"claude","defaultPermissions":"approve-all","format":"text"}' \
> /home/node/.acpx/config.json
# ββ Prepare runtime dirs ββββββββββββββββββββββββββββββββββββββββββββββββββββ
RUN mkdir -p /app/openclaw/empty-bundled-plugins \
&& node -e "try{console.log(require('/app/openclaw/package.json').version)}catch(e){console.log('unknown')}" > /app/openclaw/.version \
&& echo "[build] OpenClaw version: $(cat /app/openclaw/.version)"
# ββ Scripts + Config + Frontend ββββββββββββββββββββββββββββββββββββββββββββββ
COPY --chown=node:node scripts /home/node/scripts
COPY --chown=node:node frontend /home/node/frontend
COPY --chown=node:node workspace-templates /home/node/workspace-templates
COPY --chown=node:node openclaw.json /home/node/scripts/openclaw.json.default
RUN chmod +x /home/node/scripts/entrypoint.sh /home/node/scripts/sync_hf.py \
&& VERSION_TS=$(date +%s) \
&& sed "s/{{VERSION_TIMESTAMP}}/${VERSION_TS}/g" /home/node/frontend/electron-standalone.html > /home/node/frontend/index.html \
&& echo "[build] Frontend index.html generated (timestamp=${VERSION_TS})"
ENV NODE_ENV=production
ENV OPENCLAW_BUNDLED_PLUGINS_DIR=/app/openclaw/empty-bundled-plugins
ENV OPENCLAW_PREFER_PNPM=1
ENV PATH="/home/node/.local/bin:$PATH"
WORKDIR /home/node
CMD ["/home/node/scripts/entrypoint.sh"]
|