# 核心镜像选择 FROM node:22-slim # 1. 基础依赖补全 RUN apt-get update && apt-get install -y --no-install-recommends \ git openssh-client build-essential python3 python3-pip \ g++ make ca-certificates \ && rm -rf /var/lib/apt/lists/* # 2. 安装 HF 数据交互工具 RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages # 3. 构建环境与 Git 协议优化 RUN update-ca-certificates && \ git config --global http.sslVerify false && \ git config --global url."https://github.com/".insteadOf ssh://git@github.com/ # 4. OpenClaw 核心安装 RUN npm install -g openclaw@latest --unsafe-perm # 5. 环境变量预设 ENV PORT=7860 \ OPENCLAW_GATEWAY_MODE=local \ HOME=/root # 6. Python 同步引擎 (sync.py) RUN echo 'import os, sys, tarfile\n\ from huggingface_hub import HfApi, hf_hub_download\n\ from datetime import datetime, timedelta\n\ api = HfApi()\n\ repo_id = os.getenv("HF_DATASET")\n\ token = os.getenv("HF_TOKEN")\n\ def restore():\n\ try:\n\ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)\n\ now = datetime.now()\n\ for i in range(5):\n\ day = (now - timedelta(days=i)).strftime("%Y-%m-%d")\n\ name = f"backup_{day}.tar.gz"\n\ if name in files:\n\ path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\ with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/root/.openclaw/")\n\ print(f"Success: Restored from {name}")\n\ return True\n\ except Exception as e: print(f"Restore Error: {e}")\n\ def backup():\n\ try:\n\ day = datetime.now().strftime("%Y-%m-%d")\n\ name = f"backup_{day}.tar.gz"\n\ with tarfile.open(name, "w:gz") as tar:\n\ if os.path.exists("/root/.openclaw/sessions"): tar.add("/root/.openclaw/sessions", arcname="sessions")\n\ tar.add("/root/.openclaw/openclaw.json", arcname="openclaw.json")\n\ api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\ print(f"Backup {name} Success.")\n\ except Exception as e: print(f"Backup Error: {e}")\n\ if __name__ == "__main__":\n\ if len(sys.argv) > 1 and sys.argv[1] == "backup": backup()\n\ else: restore()' > /usr/local/bin/sync.py # 7. 启动控制逻辑(NVIDIA 配置版) RUN echo "#!/bin/bash\n\ set -e\n\ mkdir -p /root/.openclaw/sessions\n\ \n\ # 阶段 3: 执行启动前恢复\n\ python3 /usr/local/bin/sync.py restore\n\ \n\ # 处理地址逻辑\n\ CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\ \n\ # 阶段 2: 生成网关与模型配置(NVIDIA 版)\n\ cat > /root/.openclaw/openclaw.json < /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw EXPOSE 7860 CMD ["/usr/local/bin/start-openclaw"]