Download Dockerfile from asons/openclaw2: direct link, hf CLI and curl.
- Browser
- Download file 5.15 kB
-
https://huggingface.co/spaces/asons/openclaw2/resolve/main/Dockerfile
- Command line
-
hf download hf://spaces/asons/openclaw2/Dockerfile
-
curl -L -o Dockerfile https://huggingface.co/spaces/asons/openclaw2/resolve/main/Dockerfile
5.15 kB
| FROM docker.io/library/ubuntu:24.04 | |
| ENV DEBIAN_FRONTEND=noninteractive | |
| ENV TZ=Etc/UTC | |
| RUN apt-get update && apt-get install -y \ | |
| curl \ | |
| git \ | |
| python3-pip \ | |
| && rm -rf /var/lib/apt/lists/* | |
| RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ | |
| && apt-get install -y nodejs | |
| # 安装 openclaw(无微信插件) | |
| RUN npm install -g openclaw@latest | |
| RUN pip3 install --break-system-packages huggingface_hub -q | |
| # 映射 HF Secrets 到脚本期望的变量 | |
| ENV OPENCLAW_LLM_MODEL=${RAW_MODEL:-z-ai/glm4.7} | |
| ENV OPENCLAW_BACKUP_ENABLED=${OPENCLAW_BACKUP_ENABLED:-true} | |
| ENV OPENCLAW_BACKUP_DATASET_REPO=${OPENCLAW_BACKUP_DATASET_REPO:-} | |
| RUN mkdir -p /root/.openclaw /data /var/log/openclaw /scripts | |
| RUN printf '#!/bin/bash\n\ | |
| set -euo pipefail\n\ | |
| \n\ | |
| OPENCLAW_STATE_DIR="${OPENCLAW_STATE_DIR:-/root/.openclaw}"\n\ | |
| OPENCLAW_WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-${OPENCLAW_STATE_DIR}/workspace}"\n\ | |
| OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-7860}"\n\ | |
| OPENCLAW_LLM_MODEL="${OPENCLAW_LLM_MODEL:-z-ai/glm4.7}"\n\ | |
| BACKUP_ENABLED="${OPENCLAW_BACKUP_ENABLED:-true}"\n\ | |
| HF_TOKEN="${HF_TOKEN:-${HUGGINGFACE_HUB_TOKEN:-}}"\n\ | |
| BACKUP_DATASET_REPO="${OPENCLAW_BACKUP_DATASET_REPO:-}"\n\ | |
| \n\ | |
| mkdir -p /var/log/openclaw\n\ | |
| mkdir -p "${OPENCLAW_STATE_DIR}"/{workspace,agents/main/agent,agents/main/sessions,logs,identity}\n\ | |
| \n\ | |
| log_info() { echo "[$(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)] [ENTRYPOINT] $1" | tee -a /var/log/openclaw/gateway.stdout.log; }\n\ | |
| \n\ | |
| restore_if_exists() {\n\ | |
| [[ -z "${HF_TOKEN}" ]] && return 0\n\ | |
| [[ -z "${BACKUP_DATASET_REPO}" ]] && return 0\n\ | |
| log_info "检查备份数据..."\n\ | |
| RESTORE_TEMP=$(mktemp -d)\n\ | |
| if huggingface-cli download "${BACKUP_DATASET_REPO}" --repo-type dataset --token "${HF_TOKEN}" --local-dir "${RESTORE_TEMP}" 2>/dev/null; then\n\ | |
| log_info "找到备份,开始恢复数据..."\n\ | |
| [[ -d "${RESTORE_TEMP}/workspace" ]] && cp -r "${RESTORE_TEMP}/workspace/"* "${OPENCLAW_WORKSPACE_DIR}/" 2>/dev/null || true\n\ | |
| [[ -d "${RESTORE_TEMP}/agents" ]] && cp -r "${RESTORE_TEMP}/agents/"* "${OPENCLAW_STATE_DIR}/agents/" 2>/dev/null || true\n\ | |
| [[ -d "${RESTORE_TEMP}/identity" ]] && cp -r "${RESTORE_TEMP}/identity/"* "${OPENCLAW_STATE_DIR}/identity/" 2>/dev/null || true\n\ | |
| log_info "数据恢复完成"\n\ | |
| else\n\ | |
| log_info "未找到备份,跳过恢复"\n\ | |
| fi\n\ | |
| rm -rf "${RESTORE_TEMP}"\n\ | |
| }\n\ | |
| \n\ | |
| backup_on_start() {\n\ | |
| [[ "${BACKUP_ENABLED}" != "true" ]] && return 0\n\ | |
| [[ -z "${HF_TOKEN}" ]] && return 0\n\ | |
| [[ -z "${BACKUP_DATASET_REPO}" ]] && return 0\n\ | |
| log_info "执行启动备份..."\n\ | |
| BACKUP_TEMP=$(mktemp -d)\n\ | |
| cp -r "${OPENCLAW_WORKSPACE_DIR}" "${BACKUP_TEMP}/" 2>/dev/null || true\n\ | |
| cp -r "${OPENCLAW_STATE_DIR}/agents" "${BACKUP_TEMP}/" 2>/dev/null || true\n\ | |
| cp -r "${OPENCLAW_STATE_DIR}/identity" "${BACKUP_TEMP}/" 2>/dev/null || true\n\ | |
| echo "{\"backup_time\": \"$(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)\", \"trigger\": \"startup\"}" > "${BACKUP_TEMP}/backup_info.json"\n\ | |
| huggingface-cli upload "${BACKUP_DATASET_REPO}" "${BACKUP_TEMP}/" --repo-type dataset --token "${HF_TOKEN}" --commit-message "Auto-backup $(date -u +%%Y-%%m-%%dT%%H:%%M:%%SZ)" 2>/dev/null && log_info "启动备份完成" || log_info "启动备份失败(继续启动)"\n\ | |
| rm -rf "${BACKUP_TEMP}"\n\ | |
| }\n\ | |
| \n\ | |
| init_config() {\n\ | |
| local config_file="${OPENCLAW_STATE_DIR}/openclaw.json"\n\ | |
| log_info "初始化 OpenClaw 配置..."\n\ | |
| log_info "使用模型: ${OPENCLAW_LLM_MODEL}"\n\ | |
| cat > "${config_file}" <<EOFCONFIG\n\ | |
| {\n\ | |
| "meta": { "lastTouchedVersion": "2026.5.6" },\n\ | |
| "gateway": {\n\ | |
| "mode": "local",\n\ | |
| "bind": "lan",\n\ | |
| "auth": { "mode": "token", "token": "CUSTOM_GATEWAY_TOKEN_PLACEHOLDER" },\n\ | |
| "controlUi": {\n\ | |
| "allowedOrigins": ["*"],\n\ | |
| "dangerouslyDisableDeviceAuth": true,\n\ | |
| "allowInsecureAuth": true\n\ | |
| }\n\ | |
| },\n\ | |
| "models": {\n\ | |
| "providers": {\n\ | |
| "nvidia": {\n\ | |
| "baseUrl": "https://integrate.api.nvidia.com/v1",\n\ | |
| "api": "openai-completions",\n\ | |
| "models": [\n\ | |
| { "id": "'"${OPENCLAW_LLM_MODEL}"'", "name": "'"${OPENCLAW_LLM_MODEL}"'" }\n\ | |
| ]\n\ | |
| }\n\ | |
| }\n\ | |
| },\n\ | |
| "agents": {\n\ | |
| "defaults": {\n\ | |
| "model": { "primary": "nvidia/'"${OPENCLAW_LLM_MODEL}"'" }\n\ | |
| }\n\ | |
| }\n\ | |
| }\n\ | |
| EOFCONFIG\n\ | |
| sed -i "s/CUSTOM_GATEWAY_TOKEN_PLACEHOLDER/${OPENCLAW_GATEWAY_TOKEN:-}/" "${config_file}"\n\ | |
| log_info "配置初始化完成"\n\ | |
| }\n\ | |
| \n\ | |
| main() {\n\ | |
| log_info "===== OpenClaw 启动 ====="\n\ | |
| init_config\n\ | |
| restore_if_exists\n\ | |
| backup_on_start\n\ | |
| \n\ | |
| log_info "启动 OpenClaw 网关..."\n\ | |
| exec openclaw gateway --bind lan --port "${OPENCLAW_GATEWAY_PORT}" --token "${OPENCLAW_GATEWAY_TOKEN}"\n\ | |
| }\n\ | |
| main "$@"\n\ | |
| ' > /scripts/openclaw-entrypoint.sh | |
| RUN chmod +x /scripts/openclaw-entrypoint.sh | |
| EXPOSE 7860 | |
| ENTRYPOINT ["/scripts/openclaw-entrypoint.sh"] | |