File size: 3,260 Bytes
ef2eccf
 
b19d31a
0d9d280
b19d31a
ef2eccf
 
 
 
0d9d280
 
 
ef2eccf
 
 
 
 
b19d31a
ef2eccf
 
 
b19d31a
 
ef2eccf
 
 
 
 
 
1469692
 
 
 
 
 
ef2eccf
0d9d280
ef2eccf
 
0d9d280
ef2eccf
 
 
 
 
 
 
 
 
 
d8e86ce
 
ef2eccf
 
af9539c
0d9d280
ef2eccf
af9539c
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
# OpenClaw on Hugging Face Spaces β€” δΌ˜εŒ–ζž„ε»ΊοΌˆv2οΌ‰
# δΌ˜εŒ–η‚ΉοΌšnode η”¨ζˆ·ζž„ε»ΊοΌˆζΆˆι™€ chownοΌ‰γ€εˆεΉΆ RUN ε±‚οΌˆε‡ε°‘ε±‚εΌ€ι”€οΌ‰
FROM node:22-bookworm
SHELL ["/bin/bash", "-c"]

# ── Layer 1 (root): η³»η»ŸδΎθ΅– + ε·₯ε…·οΌˆε…¨ιƒ¨εˆεΉΆδΈΊδΈ€ε±‚οΌ‰β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
RUN echo "[build][layer1] System deps + tools..." && START=$(date +%s) \
  && apt-get update \
  && apt-get install -y --no-install-recommends git ca-certificates curl python3 python3-pip patch \
  && rm -rf /var/lib/apt/lists/* \
  && pip3 install --no-cache-dir --break-system-packages huggingface_hub \
  && corepack enable \
  && mkdir -p /app \
  && chown node:node /app \
  && mkdir -p /home/node/.openclaw/workspace /home/node/.openclaw/credentials \
  && chown -R node:node /home/node \
  && echo "[build][layer1] System deps + tools: $(($(date +%s) - START))s"

# ── εˆ‡ζ’εˆ° node η”¨ζˆ·οΌˆεŽη»­ζ‰€ζœ‰ζ“δ½œιƒ½δ»₯ node θΊ«δ»½οΌŒζ— ιœ€ chown)───────────────
USER node
ENV HOME=/home/node
WORKDIR /app

# ── Layer 2 (node): Clone + Patch + Install + BuildοΌˆεˆεΉΆδΈΊδΈ€ε±‚οΌ‰β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
COPY --chown=node:node patches /app/patches
RUN echo "[build][layer2] Clone + install + build..." && START=$(date +%s) \
  && git clone --depth 1 https://github.com/openclaw/openclaw.git openclaw \
  && echo "[build] git clone: $(($(date +%s) - START))s" \
  && cd openclaw \
  && for p in /app/patches/*.patch; do \
       if [ -f "$p" ]; then \
         patch -p1 < "$p" \
         && echo "[build] patch applied: $(basename $p)"; \
       fi; \
     done \
  && T1=$(date +%s) \
  && pnpm install --frozen-lockfile \
  && echo "[build] pnpm install: $(($(date +%s) - T1))s" \
  && T2=$(date +%s) \
  && pnpm build \
  && echo "[build] pnpm build: $(($(date +%s) - T2))s" \
  && T3=$(date +%s) \
  && OPENCLAW_PREFER_PNPM=1 pnpm ui:build \
  && echo "[build] pnpm ui:build: $(($(date +%s) - T3))s" \
  && test -f dist/entry.js && echo "[build] OK dist/entry.js" \
  && test -f dist/plugin-sdk/index.js && echo "[build] OK dist/plugin-sdk/index.js" \
  && test -d extensions/telegram && echo "[build] OK extensions/telegram" \
  && test -d extensions/whatsapp && echo "[build] OK extensions/whatsapp" \
  && test -d dist/control-ui && echo "[build] OK dist/control-ui" \
  && mkdir -p /app/openclaw/empty-bundled-plugins \
  && node -e "console.log(require('./package.json').version)" > /app/openclaw/.version \
  && echo "[build] version: $(cat /app/openclaw/.version)" \
  && echo "[build][layer2] Total clone+install+build: $(($(date +%s) - START))s"

# ── Layer 3 (node): Scripts + Config ──────────────────────────────────────────
COPY --chown=node:node scripts /home/node/scripts
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

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"]