feat: 完全離線化 Dockerfile v0.1.16

## 主要修復
- MinerU: 改用 system-level 安裝 (uv pip install --system)
- MinerU: 模型下載到固定目錄 /opt/mineru/models
- BabelDOC: 完整 warmup + 離線 cache
- PDFMathTranslate: ONNX 模型使用 COPY 指令
- ImageMagick: 確保已安裝

## 結構優化
- Multi-Stage Build (8 stages)
- 使用 heredoc 語法處理多行 Python
- 分階段安裝避免記憶體尖峰

## Runtime 離線模式
- HF_HOME=/nonexistent
- HF_HUB_OFFLINE=1
- BABELDOC_OFFLINE=1
- PIP_NO_INDEX=1

## 新增驗證腳本
- scripts/verify-offline.sh
This commit is contained in:
Your Name 2026-01-25 11:07:03 +08:00
parent b23d42a7b1
commit 367e0d3056
4 changed files with 1682 additions and 761 deletions

View file

@ -1,6 +1,6 @@
#!/bin/bash
# ==============================================================================
# ConvertX-CN 模型驗證腳本
# ConvertX-CN 模型驗證腳本 v2.0
# ==============================================================================
#
# 用途:驗證 Docker Image 中的預下載模型是否完整
@ -11,7 +11,7 @@
set -e
echo "========================================"
echo "🔍 ConvertX-CN 模型驗證"
echo "🔍 ConvertX-CN 模型驗證 v2.0"
echo "========================================"
echo ""
@ -19,6 +19,7 @@ echo ""
PASS=0
FAIL=0
WARN=0
ARCH=$(uname -m)
# 檢查函數
check_file() {
@ -37,22 +38,28 @@ check_file() {
check_dir() {
local path="$1"
local name="$2"
local required="${3:-false}"
if [ -d "$path" ]; then
local size=$(du -sh "$path" 2>/dev/null | awk '{print $1}')
echo "$name: $path ($size)"
((PASS++))
else
echo "⚠️ $name: $path 不存在"
((WARN++))
if [ "$required" = "true" ]; then
echo "$name: $path 不存在(必要)"
((FAIL++))
else
echo "⚠️ $name: $path 不存在(可選)"
((WARN++))
fi
fi
}
# ==============================================================================
# 1. PDFMathTranslate 模型
# 1. PDFMathTranslate / BabelDOC ONNX 模型
# ==============================================================================
echo "📦 PDFMathTranslate 模型"
echo "📦 PDFMathTranslate / BabelDOC 模型"
echo "----------------------------------------"
check_file "/models/pdfmathtranslate/model.onnx" "DocLayout-YOLO ONNX"
check_file "/root/.cache/babeldoc/models/doclayout_yolo_docstructbench_imgsz1024.onnx" "DocLayout-YOLO ONNX"
echo ""
# ==============================================================================
@ -60,20 +67,25 @@ echo ""
# ==============================================================================
echo "🔤 PDFMathTranslate 字型"
echo "----------------------------------------"
check_file "/app/GoNotoKurrent-Regular.ttf" "Noto 通用字型"
check_file "/app/SourceHanSerifCN-Regular.ttf" "思源宋體(簡體)"
check_file "/app/SourceHanSerifTW-Regular.ttf" "思源宋體(繁體)"
check_file "/app/SourceHanSerifJP-Regular.ttf" "思源宋體(日文)"
check_file "/app/SourceHanSerifKR-Regular.ttf" "思源宋體(韓文)"
check_file "/usr/share/fonts/truetype/custom/GoNotoKurrent-Regular.ttf" "Noto 通用字型"
check_file "/usr/share/fonts/truetype/custom/SourceHanSerifCN-Regular.ttf" "思源宋體(簡體)"
check_file "/usr/share/fonts/truetype/custom/SourceHanSerifTW-Regular.ttf" "思源宋體(繁體)"
check_file "/usr/share/fonts/truetype/custom/SourceHanSerifJP-Regular.ttf" "思源宋體(日文)"
check_file "/usr/share/fonts/truetype/custom/SourceHanSerifKR-Regular.ttf" "思源宋體(韓文)"
echo ""
# ==============================================================================
# 3. MinerU 模型
# 3. MinerU 模型(新路徑:/opt/mineru
# ==============================================================================
echo "📦 MinerU 模型"
echo "----------------------------------------"
check_dir "/root/.cache/huggingface/hub/PDF-Extract-Kit-1.0" "PDF-Extract-Kit-1.0 Pipeline"
check_dir "/root/.cache/huggingface/hub/MinerU-VLM" "MinerU VLM可選"
if [ "$ARCH" = "aarch64" ]; then
echo "⚠️ ARM64 架構MinerU 不支援,跳過驗證"
((WARN++))
else
check_dir "/opt/mineru/models/PDF-Extract-Kit-1.0" "PDF-Extract-Kit-1.0 Pipeline" "true"
check_file "/root/mineru.json" "MinerU 配置檔"
fi
echo ""
# ==============================================================================
@ -81,25 +93,22 @@ echo ""
# ==============================================================================
echo "📦 BabelDOC 快取"
echo "----------------------------------------"
if [ -d "/root/.cache/babeldoc" ]; then
check_dir "/root/.cache/babeldoc" "BabelDOC 快取"
elif [ -d "/root/.local/share/babeldoc" ]; then
check_dir "/root/.local/share/babeldoc" "BabelDOC 資料"
else
echo "⚠️ BabelDOC 快取目錄未找到(可能使用其他路徑)"
((WARN++))
fi
check_dir "/root/.cache/babeldoc" "BabelDOC 快取"
check_dir "/root/.cache/babeldoc/models" "BabelDOC Models"
check_dir "/root/.cache/babeldoc/fonts" "BabelDOC Fonts"
echo ""
# ==============================================================================
# 5. 環境變數檢查
# 5. 環境變數檢查(離線模式)
# ==============================================================================
echo "🔧 環境變數"
echo "🔧 環境變數(離線模式)"
echo "----------------------------------------"
echo "PDFMATHTRANSLATE_MODELS_PATH: ${PDFMATHTRANSLATE_MODELS_PATH:-未設定}"
echo "NOTO_FONT_PATH: ${NOTO_FONT_PATH:-未設定}"
echo "MINERU_MODEL_SOURCE: ${MINERU_MODEL_SOURCE:-未設定}"
echo "HF_HUB_OFFLINE: ${HF_HUB_OFFLINE:-未設定}"
echo "TRANSFORMERS_OFFLINE: ${TRANSFORMERS_OFFLINE:-未設定}"
echo "HF_HOME: ${HF_HOME:-未設定}"
echo "MINERU_MODEL_SOURCE: ${MINERU_MODEL_SOURCE:-未設定}"
echo "BABELDOC_OFFLINE: ${BABELDOC_OFFLINE:-未設定}"
echo "PIP_NO_INDEX: ${PIP_NO_INDEX:-未設定}"
echo ""
# ==============================================================================
@ -107,16 +116,40 @@ echo ""
# ==============================================================================
echo "📝 MinerU 設定檔"
echo "----------------------------------------"
if [ -f "/root/mineru.json" ]; then
if [ "$ARCH" = "aarch64" ]; then
echo "⚠️ ARM64 架構:跳過 MinerU 配置驗證"
((WARN++))
elif [ -f "/root/mineru.json" ]; then
echo "✅ /root/mineru.json 存在"
cat /root/mineru.json
((PASS++))
else
echo "⚠️ /root/mineru.json 不存在"
((WARN++))
echo " /root/mineru.json 不存在"
((FAIL++))
fi
echo ""
# ==============================================================================
# 7. 工具可執行性驗證
# ==============================================================================
echo "🔧 工具可執行性"
echo "----------------------------------------"
for cmd in mineru babeldoc pdf2zh markitdown convert ffmpeg pandoc; do
if command -v "$cmd" >/dev/null 2>&1; then
echo "$cmd: $(which $cmd)"
((PASS++))
else
if [ "$cmd" = "mineru" ] && [ "$ARCH" = "aarch64" ]; then
echo "⚠️ $cmd: ARM64 不支援"
((WARN++))
else
echo "⚠️ $cmd: 未找到"
((WARN++))
fi
fi
done
echo ""
# ==============================================================================
# 總結
# ==============================================================================
@ -134,7 +167,7 @@ if [ $FAIL -gt 0 ]; then
exit 1
elif [ $WARN -gt 0 ]; then
echo "⚠️ 驗證完成,但有警告。"
echo " 部分可選模型可能需要 runtime 下載。"
echo " 部分可選功能可能需要確認。"
exit 0
else
echo "✅ 所有模型驗證通過!"