File size: 3,776 Bytes
7d9480c 9855e31 7d9480c 9855e31 7d9480c 9855e31 7d9480c 24d3bc0 7d9480c 24d3bc0 7d9480c 9855e31 7d9480c 24d3bc0 7d9480c 24d3bc0 7d9480c 4d3a9c0 7d9480c 9855e31 7d9480c 4d3a9c0 7d9480c 4d3a9c0 7d9480c 24d3bc0 7d9480c 24d3bc0 7d9480c 24d3bc0 7d9480c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | FROM lampon/omnibox:latest
# 安装系统依赖,并添加 --break-system-packages 以允许安装 huggingface_hub
RUN apt-get update && apt-get install -y python3 python3-pip socat && \
pip3 install --no-cache-dir huggingface_hub --break-system-packages && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
# 备份脚本
RUN cat > /usr/local/bin/backup.sh << 'EOF'
#!/bin/bash
set -e
if [ -z "$HF_DATASET" ] || [ -z "$HF_TOKEN" ]; then
echo "❌ 缺少 HF_DATASET 或 HF_TOKEN 环境变量,跳过备份"
exit 0
fi
echo "$(date): 📦 开始备份 omnibox 数据..."
mkdir -p /tmp/omnibox_backup
if [ -d /app/data ]; then
cp -r /app/data /tmp/omnibox_backup/
echo "✅ 已复制 /app/data"
else
echo "⚠️ 未找到 /app/data 目录,跳过数据复制"
fi
cd /tmp
tar -czf omnibox_backup.tar.gz omnibox_backup
BACKUP_FILE="/tmp/omnibox_backup.tar.gz"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REMOTE_PATH="omnibox_backup_${TIMESTAMP}.tar.gz"
python3 <<PYEOF
from huggingface_hub import HfApi
import os
api = HfApi()
repo_id = os.environ.get("HF_DATASET")
token = os.environ.get("HF_TOKEN")
backup_file = "$BACKUP_FILE"
remote_path = "$REMOTE_PATH"
try:
api.upload_file(
path_or_fileobj=backup_file,
path_in_repo=remote_path,
repo_id=repo_id,
repo_type="dataset",
token=token
)
print(f"✅ 备份上传成功: {remote_path}")
except Exception as e:
print(f"❌ 备份上传失败: {e}")
PYEOF
rm -rf /tmp/omnibox_backup /tmp/omnibox_backup.tar.gz
echo "$(date): 🎉 备份流程完成"
EOF
RUN chmod +x /usr/local/bin/backup.sh
# 启动脚本
RUN cat > /usr/local/bin/start.sh << 'EOF'
#!/bin/bash
set -e
# 恢复备份
if [ -n "$HF_DATASET" ] && [ -n "$HF_TOKEN" ]; then
echo "🔄 检查是否存在可恢复的备份..."
python3 <<PYEOF
from huggingface_hub import HfApi, hf_hub_download
import os, tarfile, shutil
repo_id = os.environ.get("HF_DATASET")
token = os.environ.get("HF_TOKEN")
api = HfApi()
try:
files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
backup_files = [f for f in files if f.startswith("omnibox_backup_") and f.endswith(".tar.gz")]
if not backup_files:
print("📭 未找到历史备份文件")
else:
backup_files.sort(reverse=True)
latest = backup_files[0]
print(f"📥 发现最新备份: {latest},正在下载...")
path = hf_hub_download(
repo_id=repo_id,
filename=latest,
repo_type="dataset",
token=token
)
with tarfile.open(path, "r:gz") as tar:
tar.extractall(path="/tmp/restore_data")
src_data = "/tmp/restore_data/omnibox_backup/data"
dst_data = "/app/data"
if os.path.exists(src_data):
if os.path.exists(dst_data):
shutil.rmtree(dst_data)
shutil.copytree(src_data, dst_data)
print("✅ 数据恢复成功")
else:
print("⚠️ 备份文件中未找到 /data 目录,跳过恢复")
shutil.rmtree("/tmp/restore_data", ignore_errors=True)
except Exception as e:
print(f"⚠️ 恢复过程出现异常: {e}")
PYEOF
fi
# 启动主服务
echo "🚀 启动 Omnibox 主服务..."
./main &
MAIN_PID=$!
socat TCP-LISTEN:7860,fork TCP:127.0.0.1:7023 &
SOCAT_PID=$!
# 定时备份
echo "⏰ 启动自动备份(每30分钟)..."
(
while true; do
sleep 1800
/usr/local/bin/backup.sh
done
) &
BACKUP_PID=$!
trap 'echo "🛑 容器停止,执行最后一次备份..."; /usr/local/bin/backup.sh; kill $MAIN_PID $SOCAT_PID $BACKUP_PID 2>/dev/null' EXIT
wait $MAIN_PID
EOF
RUN chmod +x /usr/local/bin/start.sh
EXPOSE 7860
CMD ["/usr/local/bin/start.sh"] |