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
174 lines
5.6 KiB
Bash
174 lines
5.6 KiB
Bash
#!/usr/bin/env bash
|
||
# ==============================================================================
|
||
# ConvertX-CN 字型安裝腳本
|
||
# ==============================================================================
|
||
# 用途:安裝所有系統字型和自訂字型
|
||
# 執行環境:Docker build stage (fonts)
|
||
# ==============================================================================
|
||
|
||
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"; }
|
||
|
||
# 目錄定義
|
||
CUSTOM_FONTS_DIR="/usr/share/fonts/truetype/custom"
|
||
BABELDOC_FONTS_DIR="/root/.cache/babeldoc/fonts"
|
||
|
||
# ==============================================================================
|
||
# 系統字型(APT)
|
||
# ==============================================================================
|
||
install_system_fonts() {
|
||
log_info "安裝系統字型..."
|
||
apt-get update --fix-missing
|
||
apt-get install -y --no-install-recommends \
|
||
fonts-noto-cjk \
|
||
fonts-noto-cjk-extra \
|
||
fonts-noto-core \
|
||
fonts-noto-color-emoji \
|
||
fonts-liberation \
|
||
fonts-dejavu-core \
|
||
fonts-dejavu-extra \
|
||
fonts-freefont-ttf \
|
||
fonts-droid-fallback
|
||
rm -rf /var/lib/apt/lists/*
|
||
log_success "系統字型安裝完成"
|
||
}
|
||
|
||
# ==============================================================================
|
||
# 複製自訂字型
|
||
# ==============================================================================
|
||
install_custom_fonts() {
|
||
log_info "安裝自訂字型..."
|
||
|
||
# 創建目錄
|
||
mkdir -p "${CUSTOM_FONTS_DIR}"
|
||
mkdir -p "${BABELDOC_FONTS_DIR}"
|
||
|
||
# 檢查並複製字型
|
||
local FONTS_SRC="${1:-/app/fonts}"
|
||
|
||
if [ -d "${FONTS_SRC}" ]; then
|
||
log_info "複製字型從 ${FONTS_SRC}..."
|
||
|
||
# 複製所有 TTF 字型
|
||
find "${FONTS_SRC}" -type f \( -name "*.ttf" -o -name "*.TTF" -o -name "*.otf" -o -name "*.OTF" \) \
|
||
-exec cp -v {} "${CUSTOM_FONTS_DIR}/" \; 2>/dev/null || true
|
||
|
||
# 設定權限
|
||
chmod 644 "${CUSTOM_FONTS_DIR}"/* 2>/dev/null || true
|
||
|
||
# 統計
|
||
local COUNT
|
||
COUNT=$(find "${CUSTOM_FONTS_DIR}" -type f | wc -l)
|
||
log_success "已複製 ${COUNT} 個自訂字型"
|
||
else
|
||
log_warn "字型來源目錄 ${FONTS_SRC} 不存在"
|
||
fi
|
||
}
|
||
|
||
# ==============================================================================
|
||
# 同步字型到 BabelDOC 目錄
|
||
# ==============================================================================
|
||
sync_babeldoc_fonts() {
|
||
log_info "同步字型到 BabelDOC 目錄..."
|
||
|
||
mkdir -p "${BABELDOC_FONTS_DIR}"
|
||
|
||
# 複製關鍵字型到 BabelDOC
|
||
local fonts=(
|
||
"GoNotoKurrent-Regular.ttf"
|
||
"SourceHanSerifCN-Regular.ttf"
|
||
"SourceHanSerifTW-Regular.ttf"
|
||
"SourceHanSerifJP-Regular.ttf"
|
||
"SourceHanSerifKR-Regular.ttf"
|
||
"BiauKai.ttf"
|
||
)
|
||
|
||
for font in "${fonts[@]}"; do
|
||
if [ -f "${CUSTOM_FONTS_DIR}/${font}" ]; then
|
||
cp "${CUSTOM_FONTS_DIR}/${font}" "${BABELDOC_FONTS_DIR}/"
|
||
log_info " 已同步: ${font}"
|
||
fi
|
||
done
|
||
|
||
log_success "BabelDOC 字型同步完成"
|
||
}
|
||
|
||
# ==============================================================================
|
||
# 更新字型快取
|
||
# ==============================================================================
|
||
update_font_cache() {
|
||
log_info "更新字型快取..."
|
||
fc-cache -fv
|
||
log_success "字型快取更新完成"
|
||
}
|
||
|
||
# ==============================================================================
|
||
# 驗證字型安裝
|
||
# ==============================================================================
|
||
verify_fonts() {
|
||
log_info "驗證字型安裝..."
|
||
|
||
echo "系統字型目錄統計:"
|
||
echo " /usr/share/fonts: $(find /usr/share/fonts -type f \( -name '*.ttf' -o -name '*.otf' \) | wc -l) 個字型"
|
||
echo " ${CUSTOM_FONTS_DIR}: $(find "${CUSTOM_FONTS_DIR}" -type f 2>/dev/null | wc -l) 個字型"
|
||
echo " ${BABELDOC_FONTS_DIR}: $(find "${BABELDOC_FONTS_DIR}" -type f 2>/dev/null | wc -l) 個字型"
|
||
|
||
# 列出自訂字型
|
||
if [ -d "${CUSTOM_FONTS_DIR}" ]; then
|
||
echo ""
|
||
echo "自訂字型清單:"
|
||
ls -la "${CUSTOM_FONTS_DIR}/" 2>/dev/null || echo " (無)"
|
||
fi
|
||
|
||
# 驗證關鍵字型
|
||
echo ""
|
||
echo "關鍵字型驗證:"
|
||
local required_fonts=(
|
||
"Noto Sans CJK"
|
||
"Source Han Serif"
|
||
"Liberation"
|
||
)
|
||
|
||
for font in "${required_fonts[@]}"; do
|
||
if fc-list | grep -qi "${font}"; then
|
||
echo " ✅ ${font}: 已安裝"
|
||
else
|
||
echo " ⚠️ ${font}: 未找到"
|
||
fi
|
||
done
|
||
|
||
log_success "字型驗證完成"
|
||
}
|
||
|
||
# ==============================================================================
|
||
# 主程式
|
||
# ==============================================================================
|
||
main() {
|
||
log_info "=========================================="
|
||
log_info "開始安裝字型"
|
||
log_info "=========================================="
|
||
|
||
install_system_fonts
|
||
install_custom_fonts "${1:-/app/fonts}"
|
||
sync_babeldoc_fonts
|
||
update_font_cache
|
||
verify_fonts
|
||
|
||
log_success "=========================================="
|
||
log_success "所有字型安裝完成!"
|
||
log_success "=========================================="
|
||
}
|
||
|
||
# 執行(可接收字型來源目錄參數)
|
||
main "$@"
|