Files
DataMate/scripts/offline/build-offline.sh
Jerry Yan fb43052ddf
Some checks failed
CodeQL Advanced / Analyze (actions) (push) Has been cancelled
CodeQL Advanced / Analyze (java-kotlin) (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
feat(build): 添加传统 Docker 构建方式和诊断功能
- 在 build-offline.sh 脚本中添加 --pull=false 参数并改进错误处理
- 为 Makefile.offline.mk 中的各个服务构建任务添加 --pull=false 参数
- 新增 build-offline-classic.sh 脚本,提供不使用 BuildKit 的传统构建方式
- 新增 build-offline-v2.sh 脚本,提供增强版 BuildKit 离线构建功能
- 新增 diagnose.sh 脚本,用于诊断离线构建环境状态
- 在 Makefile 中添加 offline-build-classic 和 offline-diagnose
2026-02-02 23:53:45 +08:00

110 lines
3.6 KiB
Bash

#!/bin/bash
# BuildKit 离线构建脚本 - 在无网环境执行
# Usage: ./build-offline.sh [cache-dir] [version]
set -e
CACHE_DIR="${1:-./build-cache}"
VERSION="${2:-latest}"
BUILDKIT_CACHE_DIR="$CACHE_DIR/buildkit"
IMAGES_DIR="$CACHE_DIR/images"
RESOURCES_DIR="$CACHE_DIR/resources"
# 检查缓存目录
if [ ! -d "$CACHE_DIR" ]; then
echo "错误: 缓存目录 $CACHE_DIR 不存在"
echo "请先解压缓存包: tar -xzf build-cache-*.tar.gz"
exit 1
fi
# 确保 buildx 构建器存在
if ! docker buildx inspect offline-builder > /dev/null 2>&1; then
echo "创建 buildx 构建器..."
docker buildx create --name offline-builder --driver docker-container --use
else
docker buildx use offline-builder
fi
echo "======================================"
echo "1. 加载基础镜像"
echo "======================================"
if [ -f "$IMAGES_DIR/base-images.tar" ]; then
echo "$IMAGES_DIR/base-images.tar 加载基础镜像..."
docker load -i "$IMAGES_DIR/base-images.tar"
echo "✓ 基础镜像加载完成"
else
echo "警告: 基础镜像文件不存在,假设镜像已存在"
fi
echo ""
echo "======================================"
echo "2. 离线构建服务"
echo "======================================"
# 定义服务配置(与 export-cache.sh 保持一致)
SERVICES=(
"backend:datamate-backend:scripts/images/backend/Dockerfile"
"backend-python:datamate-backend-python:scripts/images/backend-python/Dockerfile"
"database:datamate-database:scripts/images/database/Dockerfile"
"frontend:datamate-frontend:scripts/images/frontend/Dockerfile"
"gateway:datamate-gateway:scripts/images/gateway/Dockerfile"
"runtime:datamate-runtime:scripts/images/runtime/Dockerfile"
"deer-flow-backend:deer-flow-backend:scripts/images/deer-flow-backend/Dockerfile"
"deer-flow-frontend:deer-flow-frontend:scripts/images/deer-flow-frontend/Dockerfile"
"mineru:datamate-mineru:scripts/images/mineru/Dockerfile"
)
# 检查是否有资源目录需要挂载
MOUNT_ARGS=""
if [ -d "$RESOURCES_DIR" ]; then
echo "检测到资源目录,将用于本地资源挂载"
MOUNT_ARGS="--build-arg RESOURCES_DIR=$RESOURCES_DIR"
fi
for service_config in "${SERVICES[@]}"; do
IFS=':' read -r service_name image_name dockerfile <<< "$service_config"
cache_file="$BUILDKIT_CACHE_DIR/$service_name-cache"
echo ""
echo "--------------------------------------"
echo "构建 [$service_name] -> $image_name:$VERSION"
echo "--------------------------------------"
if [ ! -d "$cache_file" ]; then
echo "警告: $service_name 的缓存不存在,跳过..."
continue
fi
# 使用缓存进行离线构建
# --pull=false: 不尝试拉取镜像
# --network=none: 禁用网络访问
docker buildx build \
--cache-from "type=local,src=$cache_file" \
--pull=false \
--network=none \
-f "$dockerfile" \
-t "$image_name:$VERSION" \
--load \
. 2>&1 || {
echo "警告: $service_name 离线构建遇到问题,尝试仅使用缓存..."
docker buildx build \
--cache-from "type=local,src=$cache_file" \
--pull=false \
-f "$dockerfile" \
-t "$image_name:$VERSION" \
--load \
. 2>&1
}
echo "$service_name 构建完成"
done
echo ""
echo "======================================"
echo "✓ 离线构建完成!"
echo "======================================"
echo ""
echo "构建的镜像列表:"
docker images | grep -E "(datamate-|deer-flow-)" || true