refactor(docker): 完整重構 Dockerfile v0.1.16

BREAKING CHANGE: Dockerfile 結構重新設計

## 重構內容

### Multi-Stage Build 結構
- Stage 1 [base]: Bun runtime 基礎
- Stage 2 [install]: Node 依賴安裝
- Stage 3 [prerelease]: 應用程式建構
- Stage 4 [system-tools]: APT 系統工具(拆分為 14 個獨立 RUN)
- Stage 5 [fonts]: 字型安裝
- Stage 6 [python-tools]: Python CLI 工具(拆分為 9 個獨立 RUN)
- Stage 7 [models]: 模型下載
- Stage 8 [release]: 最終 Image

### 新增 Scripts
- install-system-tools.sh: 系統工具安裝
- install-fonts.sh: 字型安裝
- install-python-tools.sh: Python 工具安裝
- download-models.sh: 模型下載
- verify-installation.sh: 完整安裝驗證

### 刪除舊檔案
- Dockerfile.backup
- Dockerfile.offline
- Dockerfile.old

### 路徑更新
- MinerU 模型: /opt/convertx/models/mineru/PDF-Extract-Kit-1.0
- BabelDOC 快取: /root/.cache/babeldoc

### Multi-Arch 支援
- linux/amd64: 功能完整
- linux/arm64: 安全降級(MinerU/resvg 跳過)

Closes #docker-refactor
This commit is contained in:
Your Name 2026-01-25 13:15:31 +08:00
parent e43649bc96
commit 55b0f519ab
10 changed files with 1797 additions and 2008 deletions

View file

@ -0,0 +1,219 @@
#!/usr/bin/env bash
# ==============================================================================
# ConvertX-CN Python 工具安裝腳本
# ==============================================================================
# 用途:安裝所有 Python CLI 工具
# 執行環境Docker build stage (python-tools)
# ==============================================================================
set -euo pipefail
# 顏色輸出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}🐍 [INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}✅ [SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}⚠️ [WARN]${NC} $1"; }
log_error() { echo -e "${RED}❌ [ERROR]${NC} $1"; }
# 架構檢測
ARCH=$(uname -m)
log_info "檢測架構: ${ARCH}"
# ==============================================================================
# Python 基礎環境
# ==============================================================================
install_python_base() {
log_info "安裝 Python 基礎環境..."
apt-get update --fix-missing
apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-venv \
python3-numpy \
python3-tinycss2 \
python3-opencv \
python3-img2pdf
rm -rf /var/lib/apt/lists/*
log_success "Python 基礎環境安裝完成: $(python3 --version)"
}
# ==============================================================================
# uv 套件管理器
# ==============================================================================
install_uv() {
log_info "安裝 uv 套件管理器..."
pip3 install --no-cache-dir --break-system-packages uv
log_success "uv 安裝完成: $(uv --version)"
}
# ==============================================================================
# huggingface_hub模型下載
# ==============================================================================
install_huggingface_hub() {
log_info "安裝 huggingface_hub..."
uv pip install --system --break-system-packages --no-cache huggingface_hub
log_success "huggingface_hub 安裝完成"
}
# ==============================================================================
# endesivePDF 簽章)
# ==============================================================================
install_endesive() {
log_info "安裝 endesivePDF 簽章)..."
# endesive 需要編譯依賴
apt-get update --fix-missing
apt-get install -y --no-install-recommends \
build-essential \
swig \
libpcsclite-dev \
python3-dev
uv pip install --system --break-system-packages --no-cache endesive
# 清理編譯依賴
apt-get remove -y build-essential swig python3-dev
apt-get autoremove -y
rm -rf /var/lib/apt/lists/*
log_success "endesive 安裝完成"
}
# ==============================================================================
# markitdown
# ==============================================================================
install_markitdown() {
log_info "安裝 markitdown..."
uv pip install --system --break-system-packages --no-cache "markitdown[all]"
log_success "markitdown 安裝完成"
}
# ==============================================================================
# pdf2zhPDFMathTranslate
# ==============================================================================
install_pdf2zh() {
log_info "安裝 pdf2zh..."
uv pip install --system --break-system-packages --no-cache pdf2zh
if command -v pdf2zh >/dev/null 2>&1; then
log_success "pdf2zh 安裝完成"
else
log_warn "pdf2zh 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# babeldoc
# ==============================================================================
install_babeldoc() {
log_info "安裝 babeldoc..."
uv pip install --system --break-system-packages --no-cache babeldoc || {
log_warn "babeldoc 安裝可能有警告,但繼續"
}
if command -v babeldoc >/dev/null 2>&1; then
log_success "babeldoc 安裝完成"
else
log_warn "babeldoc 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# MinerU
# ==============================================================================
install_mineru() {
log_info "安裝 MinerU..."
if [ "${ARCH}" = "aarch64" ]; then
log_warn "ARM64MinerU 不完全支援,跳過安裝"
return 0
fi
# 使用 system-level 安裝
uv pip install --system --break-system-packages --no-cache -U "mineru[all]"
# 驗證安裝
if command -v mineru >/dev/null 2>&1; then
log_success "MinerU 安裝完成: $(which mineru)"
mineru --version 2>/dev/null || log_info "(版本資訊可能不可用)"
else
log_warn "MinerU 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# tiktokenBabelDOC 依賴)
# ==============================================================================
install_tiktoken() {
log_info "安裝 tiktoken..."
uv pip install --system --break-system-packages --no-cache tiktoken
log_success "tiktoken 安裝完成"
}
# ==============================================================================
# 驗證安裝
# ==============================================================================
verify_installations() {
log_info "驗證 Python 工具安裝..."
local tools=(
"python3:Python"
"pip3:pip"
"uv:uv"
"markitdown:markitdown"
"pdf2zh:pdf2zh"
"babeldoc:babeldoc"
)
# MinerU 僅在 AMD64
if [ "${ARCH}" != "aarch64" ]; then
tools+=("mineru:MinerU")
fi
echo ""
echo "工具驗證結果:"
for tool_pair in "${tools[@]}"; do
local cmd="${tool_pair%%:*}"
local name="${tool_pair#*:}"
if command -v "${cmd}" >/dev/null 2>&1; then
echo "${name}: $(which "${cmd}")"
else
echo " ⚠️ ${name}: 未在 PATH 中找到"
fi
done
log_success "驗證完成"
}
# ==============================================================================
# 主程式
# ==============================================================================
main() {
log_info "=========================================="
log_info "開始安裝 Python 工具 (${ARCH})"
log_info "=========================================="
install_python_base
install_uv
install_huggingface_hub
install_endesive
install_markitdown
install_pdf2zh
install_babeldoc
install_mineru
install_tiktoken
verify_installations
log_success "=========================================="
log_success "所有 Python 工具安裝完成!"
log_success "=========================================="
}
# 執行
main "$@"