ted1990 commited on
Commit
91747fb
·
verified ·
1 Parent(s): 61620ed

Update Dockerfile

Browse files
Files changed (1) hide show
  1. 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. 构建环境优化(仅更新证书,不修改 Git 不安全配置)
24
  RUN update-ca-certificates
25
 
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\
@@ -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) # 清理临时文件\n\
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\"], # 移除 0.0.0.0/0 增强安全性\n\
136
  \"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
137
  \"controlUi\": { \"allowInsecureAuth\": true }\n\
138
  }\n\
139
  }\n\
140
  EOF\n\
141
  \n\
142
- # 启动定时备份进程(每 3 小时执行一次,增强安全性)\n\
 
 
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. 切换到普通用户 node(UID 1000)
151
  USER node
152
 
153
  # 10. 暴露端口
154
  EXPOSE 7860
155
 
156
- # 11. 使用 tini 作为 init 系统,启动入口脚本
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"]