From e3406a8d04938a985398fbd7501f04042d46b911 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 22 Jan 2026 19:35:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20BabelDOC=20=E6=94=B9=E7=94=A8=20generate?= =?UTF-8?q?-offline-assets=20=E6=96=B9=E5=BC=8F=E9=A0=90=E4=B8=8B=E8=BC=89?= =?UTF-8?q?=E8=B3=87=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 --generate-offline-assets 生成離線包,比 warmup 更穩定 - 添加 10 分鐘超時控制避免無限等待 - 離線包生成後使用 --restore-offline-assets 恢復到快取 - 如果離線包方式失敗,fallback 到 warmup 模式 - 最多重試 3 次,每次失敗後等待 30 秒 - 即使全部失敗,BabelDOC 仍可在 runtime 按需下載 --- Dockerfile | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index f039175..c05674d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -339,16 +339,55 @@ RUN set -eux && \ rm -rf /root/.cache/huggingface && \ \ # ======================================== - # [2/5] BabelDOC Warmup + # [2/5] BabelDOC 資源預下載 # ======================================== + # 策略:使用 --generate-offline-assets 生成離線包 + # 這比 --warmup 更穩定,因為可以完整驗證所有資源 echo "" && \ - echo "📥 [2/5] 執行 BabelDOC warmup..." && \ + echo "📥 [2/5] 執行 BabelDOC 資源預下載..." && \ if command -v babeldoc >/dev/null 2>&1; then \ - babeldoc --warmup 2>&1 || echo "⚠️ BabelDOC warmup 失敗或無需 warmup"; \ + BABELDOC_MAX_RETRIES=3; \ + BABELDOC_RETRY_COUNT=0; \ + BABELDOC_SUCCESS=false; \ + mkdir -p /tmp/babeldoc-offline && \ + while [ $BABELDOC_RETRY_COUNT -lt $BABELDOC_MAX_RETRIES ]; do \ + BABELDOC_RETRY_COUNT=$((BABELDOC_RETRY_COUNT + 1)); \ + echo "🔄 BabelDOC 資源下載嘗試 $BABELDOC_RETRY_COUNT/$BABELDOC_MAX_RETRIES..."; \ + if timeout 600 babeldoc --generate-offline-assets /tmp/babeldoc-offline 2>&1; then \ + echo "✅ BabelDOC 離線資源包生成成功"; \ + OFFLINE_PKG=$(ls /tmp/babeldoc-offline/offline_assets_*.zip 2>/dev/null | head -1); \ + if [ -n "$OFFLINE_PKG" ] && [ -f "$OFFLINE_PKG" ]; then \ + echo "📦 找到離線包: $OFFLINE_PKG"; \ + if babeldoc --restore-offline-assets "$OFFLINE_PKG" 2>&1; then \ + echo "✅ BabelDOC 資源已成功恢復到快取"; \ + BABELDOC_SUCCESS=true; \ + break; \ + else \ + echo "⚠️ 資源恢復失敗,重試..."; \ + fi; \ + else \ + echo "⚠️ 未找到離線包,嘗試 warmup 模式..."; \ + if timeout 600 babeldoc --warmup 2>&1; then \ + BABELDOC_SUCCESS=true; \ + break; \ + fi; \ + fi; \ + else \ + echo "⚠️ BabelDOC 資源下載失敗或超時(10分鐘),等待 30 秒後重試..."; \ + sleep 30; \ + fi; \ + done; \ + rm -rf /tmp/babeldoc-offline; \ + if [ "$BABELDOC_SUCCESS" = "true" ]; then \ + echo "✅ BabelDOC 資源預下載完成"; \ else \ - echo "⚠️ babeldoc 命令不存在,跳過 warmup"; \ + echo "⚠️ BabelDOC 資源下載在 $BABELDOC_MAX_RETRIES 次嘗試後仍失敗"; \ + echo " BabelDOC 功能將在 runtime 時按需下載資源"; \ + fi; \ + else \ + echo "⚠️ babeldoc 命令不存在,跳過資源預下載"; \ fi && \ - echo "✅ BabelDOC warmup 步驟完成" && \ + echo "✅ BabelDOC 步驟完成" && \ \ # ======================================== # [3/5] PDFMathTranslate 多語言字型