openclaw2 / Dockerfile
brucever's picture
Update Dockerfile
d91fa6c verified
# 核心镜像:Node 22 slim
FROM node:22-slim
# 1. 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
git openssh-client build-essential \
g++ make ca-certificates socat \
&& rm -rf /var/lib/apt/lists/*
# 2. 构建环境优化
RUN update-ca-certificates && \
git config --global http.sslVerify false && \
git config --global url."https://github.com/".insteadOf ssh://git@github.com/
# 3. 全局安装 OpenClaw 最新版
RUN npm install -g openclaw@latest --unsafe-perm
# 4. 环境与权限设置
ENV PORT=7860 \
HOME=/home/node
RUN mkdir -p /home/node/.openclaw/sessions \
&& mkdir -p /home/node/.openclaw/workspace \
&& mkdir -p /home/node/data \
&& chown -R node:node /home/node
# 5. 容器入口脚本
RUN echo "#!/bin/bash\n\
set -e\n\
\n\
if [ -n \"\$HF_TOKEN\" ] && [ -n \"\$DATASET_REPO\" ]; then\n\
echo \"🚀 初始化 Git 自动备份...\"\n\
git config --global user.email \"openclaw-bot@huggingface.co\"\n\
git config --global user.name \"OpenClaw Bot\"\n\
cd /home/node/data\n\
if [ ! -d \".git\" ]; then\n\
echo \"📥 克隆数据集: \$DATASET_REPO\"\n\
git clone https://user:\$HF_TOKEN@huggingface.co/datasets/\$DATASET_REPO .\n\
else\n\
echo \"📥 拉取最新数据...\"\n\
git pull origin main\n\
fi\n\
if [ \"\$(ls -A /home/node/data)\" ]; then\n\
echo \"♻️ 正在恢复历史数据...\"\n\
cp -r /home/node/data/* /home/node/.openclaw/ 2>/dev/null || true\n\
fi\n\
fi\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\
echo \"⚙️ 正在生成 OpenClaw 配置文件...\"\n\
cat > /home/node/.openclaw/openclaw.json <<EOF\n\
{\n\
\"models\": {\n\
\"providers\": {\n\
\"siliconflow\": {\n\
\"baseUrl\": \"\$CLEAN_BASE\",\n\
\"apiKey\": \"\$OPENAI_API_KEY\",\n\
\"api\": \"openai-completions\",\n\
\"models\": [{ \"id\": \"\$MODEL\", \"name\": \"DeepSeek\", \"contextWindow\": 128000 }]\n\
}\n\
}\n\
},\n\
\"agents\": { \"defaults\": { \"model\": { \"primary\": \"siliconflow/\$MODEL\" } } },\n\
\"gateway\": {\n\
\"mode\": \"local\", \"bind\": \"loopback\", \"port\": 25808,\n\
\"trustedProxies\": [\"127.0.0.1/32\", \"0.0.0.0/0\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n\
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
\"controlUi\": { \"allowInsecureAuth\": true }\n\
}\n\
}\n\
EOF\n\
\n\
if [ -n \"\$HF_TOKEN\" ] && [ -n \"\$DATASET_REPO\" ]; then\n\
(while true; do \n\
sleep 300;\n\
cp -r /home/node/.openclaw/sessions /home/node/data/ 2>/dev/null || true;\n\
cp -r /home/node/.openclaw/workspace /home/node/data/ 2>/dev/null || true;\n\
\n\
# 👇 核心修复:干掉嵌套的 .git 文件夹,防止 Git 变异成子模块崩溃\n\
rm -rf /home/node/data/workspace/.git 2>/dev/null || true;\n\
\n\
cd /home/node/data;\n\
if [[ \$(git status --porcelain) ]]; then\n\
echo \"💾 [自动同步] 发现数据变动,正在上传...\"\n\
git add .;\n\
git commit -m \"Auto sync: \$(date)\";\n\
git push https://user:\$HF_TOKEN@huggingface.co/datasets/\$DATASET_REPO main > /dev/null 2>&1;\n\
fi;\n\
done) &\n\
fi\n\
\n\
cd /home/node/.openclaw\n\
echo \"🔌 启动端口转发引擎...\"\n\
socat TCP4-LISTEN:7860,fork,reuseaddr TCP4:127.0.0.1:25808 &\n\
\n\
openclaw browser start
echo \"🚀 启动 OpenClaw Gateway...\"\n\
exec openclaw gateway run --port 25808 --allow-unconfigured\n\
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
# 6. 切换到普通用户运行
USER node
WORKDIR /home/node
EXPOSE 7860
CMD ["/usr/local/bin/start-openclaw"]