Update Dockerfile
Browse files- Dockerfile +16 -21
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,25 +17,25 @@ 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.
|
| 24 |
RUN update-ca-certificates
|
| 25 |
|
| 26 |
# 4. 全局安装 OpenClaw
|
| 27 |
RUN npm install -g openclaw@latest --unsafe-perm
|
| 28 |
|
| 29 |
-
# 5. 准备数据目录并设置权限(使用
|
| 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\
|
|
@@ -69,7 +69,6 @@ def restore():\n\
|
|
| 69 |
\n\
|
| 70 |
def backup():\n\
|
| 71 |
try:\n\
|
| 72 |
-
# 检查是否存在需要备份的路径\n\
|
| 73 |
targets = ["sessions", "workspace", "agents", "memory", "openclaw.json"]\n\
|
| 74 |
existing = [t for t in targets if os.path.exists(os.path.join(DATA_DIR, t))]\n\
|
| 75 |
if not existing:\n\
|
|
@@ -85,7 +84,7 @@ def backup():\n\
|
|
| 85 |
tar.add(full_path, arcname=target)\n\
|
| 86 |
api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
|
| 87 |
print(f"--- [SYNC] 备份上传成功! ---")\n\
|
| 88 |
-
os.remove(name)
|
| 89 |
except Exception as e:\n\
|
| 90 |
print(f"--- [SYNC] 备份失败: {e} ---")\n\
|
| 91 |
\n\
|
|
@@ -96,27 +95,22 @@ if __name__ == "__main__":\n\
|
|
| 96 |
restore()\n\
|
| 97 |
' > /usr/local/bin/sync.py
|
| 98 |
|
| 99 |
-
# 8. 容器入口脚本 (start-openclaw) -
|
| 100 |
RUN echo "#!/bin/bash\n\
|
| 101 |
set -e\n\
|
| 102 |
\n\
|
| 103 |
-
# 强制检查必要环境变量\n\
|
| 104 |
: \"\${OPENAI_API_BASE:?环境变量 OPENAI_API_BASE 未设置}\"\n\
|
| 105 |
: \"\${OPENAI_API_KEY:?环境变量 OPENAI_API_KEY 未设置}\"\n\
|
| 106 |
: \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
|
| 107 |
: \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
|
| 108 |
\n\
|
| 109 |
-
# 确保数据目录存在且可写\n\
|
| 110 |
DATA_DIR=\"\$HOME/.openclaw\"\n\
|
| 111 |
mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
|
| 112 |
\n\
|
| 113 |
-
# 启动前执行数据恢复\n\
|
| 114 |
python3 /usr/local/bin/sync.py restore\n\
|
| 115 |
\n\
|
| 116 |
-
# 清理 API Base 地址\n\
|
| 117 |
CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
|
| 118 |
\n\
|
| 119 |
-
# 生成 openclaw.json 配置文件(使用当前用户权限)\n\
|
| 120 |
cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
|
| 121 |
{\n\
|
| 122 |
\"models\": {\n\
|
|
@@ -132,27 +126,28 @@ cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
|
|
| 132 |
\"agents\": { \"defaults\": { \"model\": { \"primary\": \"siliconflow/\$MODEL\" } } },\n\
|
| 133 |
\"gateway\": {\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\"],
|
| 136 |
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
|
| 137 |
\"controlUi\": { \"allowInsecureAuth\": true }\n\
|
| 138 |
}\n\
|
| 139 |
}\n\
|
| 140 |
EOF\n\
|
| 141 |
\n\
|
| 142 |
-
|
|
|
|
|
|
|
| 143 |
(while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
|
| 144 |
\n\
|
| 145 |
-
# 启动 OpenClaw 网关\n\
|
| 146 |
openclaw doctor --fix\n\
|
| 147 |
exec openclaw gateway run --port \$PORT\n\
|
| 148 |
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
|
| 149 |
|
| 150 |
-
# 9. 切换到
|
| 151 |
USER node
|
| 152 |
|
| 153 |
# 10. 暴露端口
|
| 154 |
EXPOSE 7860
|
| 155 |
|
| 156 |
-
# 11. 使用 tini
|
| 157 |
ENTRYPOINT ["/usr/bin/tini", "--"]
|
| 158 |
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 证书
|
| 24 |
RUN update-ca-certificates
|
| 25 |
|
| 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\
|
|
|
|
| 69 |
\n\
|
| 70 |
def backup():\n\
|
| 71 |
try:\n\
|
|
|
|
| 72 |
targets = ["sessions", "workspace", "agents", "memory", "openclaw.json"]\n\
|
| 73 |
existing = [t for t in targets if os.path.exists(os.path.join(DATA_DIR, t))]\n\
|
| 74 |
if not existing:\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) - 修正注释和权限
|
| 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\
|
|
|
|
| 126 |
\"agents\": { \"defaults\": { \"model\": { \"primary\": \"siliconflow/\$MODEL\" } } },\n\
|
| 127 |
\"gateway\": {\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\": { \"allowInsecureAuth\": true }\n\
|
| 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
|
| 144 |
|
| 145 |
+
# 9. 切换到 node 用户
|
| 146 |
USER node
|
| 147 |
|
| 148 |
# 10. 暴露端口
|
| 149 |
EXPOSE 7860
|
| 150 |
|
| 151 |
+
# 11. 使用 tini 启动
|
| 152 |
ENTRYPOINT ["/usr/bin/tini", "--"]
|
| 153 |
CMD ["/usr/local/bin/start-openclaw"]
|