Update Dockerfile
Browse files- Dockerfile +22 -10
Dockerfile
CHANGED
|
@@ -1,11 +1,11 @@
|
|
| 1 |
# 核心镜像:Node 22 slim
|
| 2 |
FROM node:22-slim
|
| 3 |
|
| 4 |
-
# 安装 tini 作为 init 系统
|
| 5 |
RUN apt-get update && apt-get install -y --no-install-recommends tini \
|
| 6 |
&& rm -rf /var/lib/apt/lists/*
|
| 7 |
|
| 8 |
-
# 1. 安装系统依赖
|
| 9 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 10 |
git \
|
| 11 |
openssh-client \
|
|
@@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
| 17 |
ca-certificates \
|
| 18 |
&& rm -rf /var/lib/apt/lists/*
|
| 19 |
|
| 20 |
-
# 2. 安装 Hugging Face 命令行工具
|
| 21 |
RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
|
| 22 |
|
| 23 |
# 3. 更新 CA 证书
|
|
@@ -26,16 +26,16 @@ RUN update-ca-certificates
|
|
| 26 |
# 4. 全局安装 OpenClaw
|
| 27 |
RUN npm install -g openclaw@latest --unsafe-perm
|
| 28 |
|
| 29 |
-
# 5. 准备数据目录并设置权限(使用 node 用户)
|
| 30 |
RUN mkdir -p /home/node/.openclaw && \
|
| 31 |
chown -R node:node /home/node/.openclaw
|
| 32 |
|
| 33 |
-
# 6. 设置环境变量
|
| 34 |
ENV PORT=7860 \
|
| 35 |
OPENCLAW_GATEWAY_MODE=local \
|
| 36 |
HOME=/home/node
|
| 37 |
|
| 38 |
-
# 7. 核心同步引擎 (sync.py)
|
| 39 |
RUN echo 'import os, sys, tarfile\n\
|
| 40 |
from huggingface_hub import HfApi, hf_hub_download\n\
|
| 41 |
from datetime import datetime, timedelta\n\
|
|
@@ -84,7 +84,7 @@ def backup():\n\
|
|
| 84 |
tar.add(full_path, arcname=target)\n\
|
| 85 |
api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
|
| 86 |
print(f"--- [SYNC] 备份上传成功! ---")\n\
|
| 87 |
-
os.remove(name)\n\
|
| 88 |
except Exception as e:\n\
|
| 89 |
print(f"--- [SYNC] 备份失败: {e} ---")\n\
|
| 90 |
\n\
|
|
@@ -95,22 +95,28 @@ if __name__ == "__main__":\n\
|
|
| 95 |
restore()\n\
|
| 96 |
' > /usr/local/bin/sync.py
|
| 97 |
|
| 98 |
-
# 8. 容器入口脚本 (start-openclaw) -
|
| 99 |
RUN echo "#!/bin/bash\n\
|
| 100 |
set -e\n\
|
| 101 |
\n\
|
|
|
|
| 102 |
: \"\${OPENAI_API_BASE:?环境变量 OPENAI_API_BASE 未设置}\"\n\
|
| 103 |
: \"\${OPENAI_API_KEY:?环境变量 OPENAI_API_KEY 未设置}\"\n\
|
| 104 |
: \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
|
| 105 |
: \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
|
| 106 |
\n\
|
|
|
|
| 107 |
DATA_DIR=\"\$HOME/.openclaw\"\n\
|
| 108 |
mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
|
| 109 |
\n\
|
|
|
|
| 110 |
python3 /usr/local/bin/sync.py restore\n\
|
| 111 |
\n\
|
|
|
|
| 112 |
CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
|
| 113 |
\n\
|
|
|
|
|
|
|
| 114 |
cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
|
| 115 |
{\n\
|
| 116 |
\"models\": {\n\
|
|
@@ -128,16 +134,22 @@ cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
|
|
| 128 |
\"mode\": \"local\", \"bind\": \"lan\", \"port\": \$PORT,\n\
|
| 129 |
\"trustedProxies\": [\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n\
|
| 130 |
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
|
| 131 |
-
\"controlUi\": {
|
|
|
|
|
|
|
|
|
|
| 132 |
}\n\
|
| 133 |
}\n\
|
| 134 |
EOF\n\
|
| 135 |
\n\
|
|
|
|
| 136 |
chmod 700 \"\$DATA_DIR\"\n\
|
| 137 |
chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
|
| 138 |
\n\
|
|
|
|
| 139 |
(while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
|
| 140 |
\n\
|
|
|
|
| 141 |
openclaw doctor --fix\n\
|
| 142 |
exec openclaw gateway run --port \$PORT\n\
|
| 143 |
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
|
|
@@ -148,6 +160,6 @@ USER node
|
|
| 148 |
# 10. 暴露端口
|
| 149 |
EXPOSE 7860
|
| 150 |
|
| 151 |
-
# 11. 使用 tini 启动
|
| 152 |
ENTRYPOINT ["/usr/bin/tini", "--"]
|
| 153 |
CMD ["/usr/local/bin/start-openclaw"]
|
|
|
|
| 1 |
# 核心镜像:Node 22 slim
|
| 2 |
FROM node:22-slim
|
| 3 |
|
| 4 |
+
# 安装 tini 作为 init 系统,正确处理信号和僵尸进程
|
| 5 |
RUN apt-get update && apt-get install -y --no-install-recommends tini \
|
| 6 |
&& rm -rf /var/lib/apt/lists/*
|
| 7 |
|
| 8 |
+
# 1. 安装系统依赖(分行列出,便于维护)
|
| 9 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 10 |
git \
|
| 11 |
openssh-client \
|
|
|
|
| 17 |
ca-certificates \
|
| 18 |
&& rm -rf /var/lib/apt/lists/*
|
| 19 |
|
| 20 |
+
# 2. 安装 Hugging Face 命令行工具(允许覆盖外部管理环境)
|
| 21 |
RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
|
| 22 |
|
| 23 |
# 3. 更新 CA 证书
|
|
|
|
| 26 |
# 4. 全局安装 OpenClaw
|
| 27 |
RUN npm install -g openclaw@latest --unsafe-perm
|
| 28 |
|
| 29 |
+
# 5. 准备数据目录并设置权限(使用 node 用户,UID 1000)
|
| 30 |
RUN mkdir -p /home/node/.openclaw && \
|
| 31 |
chown -R node:node /home/node/.openclaw
|
| 32 |
|
| 33 |
+
# 6. 设置环境变量(适配 node 用户路径)
|
| 34 |
ENV PORT=7860 \
|
| 35 |
OPENCLAW_GATEWAY_MODE=local \
|
| 36 |
HOME=/home/node
|
| 37 |
|
| 38 |
+
# 7. 核心同步引擎 (sync.py) - 优化备份逻辑:避免空打包
|
| 39 |
RUN echo 'import os, sys, tarfile\n\
|
| 40 |
from huggingface_hub import HfApi, hf_hub_download\n\
|
| 41 |
from datetime import datetime, timedelta\n\
|
|
|
|
| 84 |
tar.add(full_path, arcname=target)\n\
|
| 85 |
api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
|
| 86 |
print(f"--- [SYNC] 备份上传成功! ---")\n\
|
| 87 |
+
os.remove(name) # 清理临时文件\n\
|
| 88 |
except Exception as e:\n\
|
| 89 |
print(f"--- [SYNC] 备份失败: {e} ---")\n\
|
| 90 |
\n\
|
|
|
|
| 95 |
restore()\n\
|
| 96 |
' > /usr/local/bin/sync.py
|
| 97 |
|
| 98 |
+
# 8. 容器入口脚本 (start-openclaw) - 增强健壮性,并添加 allowedOrigins 配置
|
| 99 |
RUN echo "#!/bin/bash\n\
|
| 100 |
set -e\n\
|
| 101 |
\n\
|
| 102 |
+
# 强制检查必要环境变量\n\
|
| 103 |
: \"\${OPENAI_API_BASE:?环境变量 OPENAI_API_BASE 未设置}\"\n\
|
| 104 |
: \"\${OPENAI_API_KEY:?环境变量 OPENAI_API_KEY 未设置}\"\n\
|
| 105 |
: \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
|
| 106 |
: \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
|
| 107 |
\n\
|
| 108 |
+
# 确保数据目录存在且可写\n\
|
| 109 |
DATA_DIR=\"\$HOME/.openclaw\"\n\
|
| 110 |
mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
|
| 111 |
\n\
|
| 112 |
+
# 启动前执行数据恢复\n\
|
| 113 |
python3 /usr/local/bin/sync.py restore\n\
|
| 114 |
\n\
|
| 115 |
+
# 清理 API Base 地址\n\
|
| 116 |
CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
|
| 117 |
\n\
|
| 118 |
+
# 生成 openclaw.json 配置文件(使用当前用户权限)\n\
|
| 119 |
+
# 注意:allowedOrigins 中必须包含 Hugging Face Space 的域名,否则无法从外部访问控制界面\n\
|
| 120 |
cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
|
| 121 |
{\n\
|
| 122 |
\"models\": {\n\
|
|
|
|
| 134 |
\"mode\": \"local\", \"bind\": \"lan\", \"port\": \$PORT,\n\
|
| 135 |
\"trustedProxies\": [\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n\
|
| 136 |
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
|
| 137 |
+
\"controlUi\": {\n\
|
| 138 |
+
\"allowInsecureAuth\": true,\n\
|
| 139 |
+
\"allowedOrigins\": [\"https://ted1990-openclaw.hf.space\"]\n\
|
| 140 |
+
}\n\
|
| 141 |
}\n\
|
| 142 |
}\n\
|
| 143 |
EOF\n\
|
| 144 |
\n\
|
| 145 |
+
# 修复权限(根据 doctor 建议)\n\
|
| 146 |
chmod 700 \"\$DATA_DIR\"\n\
|
| 147 |
chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
|
| 148 |
\n\
|
| 149 |
+
# 启动定时备份进程(每 3 小时执行一次)\n\
|
| 150 |
(while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
|
| 151 |
\n\
|
| 152 |
+
# 启动 OpenClaw 网关\n\
|
| 153 |
openclaw doctor --fix\n\
|
| 154 |
exec openclaw gateway run --port \$PORT\n\
|
| 155 |
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
|
|
|
|
| 160 |
# 10. 暴露端口
|
| 161 |
EXPOSE 7860
|
| 162 |
|
| 163 |
+
# 11. 使用 tini 作为 init 系统,启动入口脚本
|
| 164 |
ENTRYPOINT ["/usr/bin/tini", "--"]
|
| 165 |
CMD ["/usr/local/bin/start-openclaw"]
|