306 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
#!/bin/bash
 | 
						||
# 该脚本用于从源码构建WeKnora的所有Docker镜像
 | 
						||
 | 
						||
# 设置颜色
 | 
						||
GREEN='\033[0;32m'
 | 
						||
YELLOW='\033[1;33m'
 | 
						||
RED='\033[0;31m'
 | 
						||
BLUE='\033[0;34m'
 | 
						||
NC='\033[0m' # 无颜色
 | 
						||
 | 
						||
# 获取项目根目录(脚本所在目录的上一级)
 | 
						||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 | 
						||
PROJECT_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )"
 | 
						||
 | 
						||
# 版本信息
 | 
						||
VERSION="1.0.0"
 | 
						||
SCRIPT_NAME=$(basename "$0")
 | 
						||
 | 
						||
# 显示帮助信息
 | 
						||
show_help() {
 | 
						||
    echo -e "${GREEN}WeKnora 镜像构建脚本 v${VERSION}${NC}"
 | 
						||
    echo -e "${GREEN}用法:${NC} $0 [选项]"
 | 
						||
    echo "选项:"
 | 
						||
    echo "  -h, --help     显示帮助信息"
 | 
						||
    echo "  -a, --all      构建所有镜像(默认)"
 | 
						||
    echo "  -p, --app      仅构建应用镜像"
 | 
						||
    echo "  -d, --docreader 仅构建文档读取器镜像"
 | 
						||
    echo "  -f, --frontend 仅构建前端镜像"
 | 
						||
    echo "  -c, --clean    清理所有本地镜像"
 | 
						||
    echo "  -v, --version  显示版本信息"
 | 
						||
    exit 0
 | 
						||
}
 | 
						||
 | 
						||
# 显示版本信息
 | 
						||
show_version() {
 | 
						||
    echo -e "${GREEN}WeKnora 镜像构建脚本 v${VERSION}${NC}"
 | 
						||
    exit 0
 | 
						||
}
 | 
						||
 | 
						||
# 日志函数
 | 
						||
log_info() {
 | 
						||
    echo -e "${BLUE}[INFO]${NC} $1"
 | 
						||
}
 | 
						||
 | 
						||
log_warning() {
 | 
						||
    echo -e "${YELLOW}[WARNING]${NC} $1"
 | 
						||
}
 | 
						||
 | 
						||
log_error() {
 | 
						||
    echo -e "${RED}[ERROR]${NC} $1"
 | 
						||
}
 | 
						||
 | 
						||
log_success() {
 | 
						||
    echo -e "${GREEN}[SUCCESS]${NC} $1"
 | 
						||
}
 | 
						||
 | 
						||
# 检查Docker是否已安装
 | 
						||
check_docker() {
 | 
						||
    log_info "检查Docker环境..."
 | 
						||
    
 | 
						||
    if ! command -v docker &> /dev/null; then
 | 
						||
        log_error "未安装Docker,请先安装Docker"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
    
 | 
						||
    # 检查Docker服务运行状态
 | 
						||
    if ! docker info &> /dev/null; then
 | 
						||
        log_error "Docker服务未运行,请启动Docker服务"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
    
 | 
						||
    log_success "Docker环境检查通过"
 | 
						||
    return 0
 | 
						||
}
 | 
						||
 | 
						||
# 检测平台
 | 
						||
check_platform() {
 | 
						||
    log_info "检测系统平台信息..."
 | 
						||
    if [ "$(uname -m)" = "x86_64" ]; then
 | 
						||
        export PLATFORM="linux/amd64"
 | 
						||
    elif [ "$(uname -m)" = "aarch64" ] || [ "$(uname -m)" = "arm64" ]; then
 | 
						||
        export PLATFORM="linux/arm64"
 | 
						||
    else
 | 
						||
        log_warning "未识别的平台类型:$(uname -m),将使用默认平台 linux/amd64"
 | 
						||
        export PLATFORM="linux/amd64"
 | 
						||
    fi
 | 
						||
    log_info "当前平台:$PLATFORM"
 | 
						||
}
 | 
						||
 | 
						||
# 构建应用镜像
 | 
						||
build_app_image() {
 | 
						||
    log_info "构建应用镜像 (weknora-app)..."
 | 
						||
    
 | 
						||
    cd "$PROJECT_ROOT"
 | 
						||
    
 | 
						||
    docker build \
 | 
						||
        --platform $PLATFORM \
 | 
						||
        --build-arg GOPRIVATE_ARG=${GOPRIVATE:-""} \
 | 
						||
        --build-arg GOPROXY_ARG=${GOPROXY:-"https://goproxy.cn,direct"} \
 | 
						||
        --build-arg GOSUMDB_ARG=${GOSUMDB:-"off"} \
 | 
						||
        -f docker/Dockerfile.app \
 | 
						||
        -t wechatopenai/weknora-app:latest \
 | 
						||
        .
 | 
						||
    
 | 
						||
    if [ $? -eq 0 ]; then
 | 
						||
        log_success "应用镜像构建成功"
 | 
						||
        return 0
 | 
						||
    else
 | 
						||
        log_error "应用镜像构建失败"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
# 构建文档读取器镜像
 | 
						||
build_docreader_image() {
 | 
						||
    log_info "构建文档读取器镜像 (weknora-docreader)..."
 | 
						||
    
 | 
						||
    cd "$PROJECT_ROOT"
 | 
						||
    
 | 
						||
    docker build \
 | 
						||
        --platform $PLATFORM \
 | 
						||
        --build-arg PLATFORM=$PLATFORM \
 | 
						||
        -f docker/Dockerfile.docreader \
 | 
						||
        -t wechatopenai/weknora-docreader:latest \
 | 
						||
        .
 | 
						||
    
 | 
						||
    if [ $? -eq 0 ]; then
 | 
						||
        log_success "文档读取器镜像构建成功"
 | 
						||
        return 0
 | 
						||
    else
 | 
						||
        log_error "文档读取器镜像构建失败"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
# 构建前端镜像
 | 
						||
build_frontend_image() {
 | 
						||
    log_info "构建前端镜像 (weknora-ui)..."
 | 
						||
    
 | 
						||
    cd "$PROJECT_ROOT"
 | 
						||
    
 | 
						||
    docker build \
 | 
						||
        --platform $PLATFORM \
 | 
						||
        -f frontend/Dockerfile \
 | 
						||
        -t wechatopenai/weknora-ui:latest \
 | 
						||
        frontend/
 | 
						||
    
 | 
						||
    if [ $? -eq 0 ]; then
 | 
						||
        log_success "前端镜像构建成功"
 | 
						||
        return 0
 | 
						||
    else
 | 
						||
        log_error "前端镜像构建失败"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
# 构建所有镜像
 | 
						||
build_all_images() {
 | 
						||
    log_info "开始构建所有镜像..."
 | 
						||
    
 | 
						||
    local app_result=0
 | 
						||
    local docreader_result=0
 | 
						||
    local frontend_result=0
 | 
						||
    
 | 
						||
    # 构建应用镜像
 | 
						||
    build_app_image
 | 
						||
    app_result=$?
 | 
						||
    
 | 
						||
    # 构建文档读取器镜像
 | 
						||
    build_docreader_image
 | 
						||
    docreader_result=$?
 | 
						||
    
 | 
						||
    # 构建前端镜像
 | 
						||
    build_frontend_image
 | 
						||
    frontend_result=$?
 | 
						||
    
 | 
						||
    # 显示构建结果
 | 
						||
    echo ""
 | 
						||
    log_info "=== 构建结果 ==="
 | 
						||
    if [ $app_result -eq 0 ]; then
 | 
						||
        log_success "✓ 应用镜像构建成功"
 | 
						||
    else
 | 
						||
        log_error "✗ 应用镜像构建失败"
 | 
						||
    fi
 | 
						||
    
 | 
						||
    if [ $docreader_result -eq 0 ]; then
 | 
						||
        log_success "✓ 文档读取器镜像构建成功"
 | 
						||
    else
 | 
						||
        log_error "✗ 文档读取器镜像构建失败"
 | 
						||
    fi
 | 
						||
    
 | 
						||
    if [ $frontend_result -eq 0 ]; then
 | 
						||
        log_success "✓ 前端镜像构建成功"
 | 
						||
    else
 | 
						||
        log_error "✗ 前端镜像构建失败"
 | 
						||
    fi
 | 
						||
    
 | 
						||
    if [ $app_result -eq 0 ] && [ $docreader_result -eq 0 ] && [ $frontend_result -eq 0 ]; then
 | 
						||
        log_success "所有镜像构建完成!"
 | 
						||
        return 0
 | 
						||
    else
 | 
						||
        log_error "部分镜像构建失败"
 | 
						||
        return 1
 | 
						||
    fi
 | 
						||
}
 | 
						||
 | 
						||
# 清理本地镜像
 | 
						||
clean_images() {
 | 
						||
    log_info "清理本地WeKnora镜像..."
 | 
						||
    
 | 
						||
    # 停止相关容器
 | 
						||
    log_info "停止相关容器..."
 | 
						||
    docker stop $(docker ps -q --filter "ancestor=wechatopenai/weknora-app:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    docker stop $(docker ps -q --filter "ancestor=wechatopenai/weknora-docreader:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    docker stop $(docker ps -q --filter "ancestor=wechatopenai/weknora-ui:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    
 | 
						||
    # 删除相关容器
 | 
						||
    log_info "删除相关容器..."
 | 
						||
    docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-app:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-docreader:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-ui:latest" 2>/dev/null) 2>/dev/null || true
 | 
						||
    
 | 
						||
    # 删除镜像
 | 
						||
    log_info "删除本地镜像..."
 | 
						||
    docker rmi wechatopenai/weknora-app:latest 2>/dev/null || true
 | 
						||
    docker rmi wechatopenai/weknora-docreader:latest 2>/dev/null || true
 | 
						||
    docker rmi wechatopenai/weknora-ui:latest 2>/dev/null || true
 | 
						||
    
 | 
						||
    docker image prune -f
 | 
						||
    
 | 
						||
    log_success "镜像清理完成"
 | 
						||
    return 0
 | 
						||
}
 | 
						||
 | 
						||
# 解析命令行参数
 | 
						||
BUILD_ALL=false
 | 
						||
BUILD_APP=false
 | 
						||
BUILD_DOCREADER=false
 | 
						||
BUILD_FRONTEND=false
 | 
						||
CLEAN_IMAGES=false
 | 
						||
 | 
						||
# 没有参数时默认构建所有镜像
 | 
						||
if [ $# -eq 0 ]; then
 | 
						||
    BUILD_ALL=true
 | 
						||
fi
 | 
						||
 | 
						||
while [ "$1" != "" ]; do
 | 
						||
    case $1 in
 | 
						||
        -h | --help )       show_help
 | 
						||
                            ;;
 | 
						||
        -a | --all )        BUILD_ALL=true
 | 
						||
                            ;;
 | 
						||
        -p | --app )        BUILD_APP=true
 | 
						||
                            ;;
 | 
						||
        -d | --docreader )  BUILD_DOCREADER=true
 | 
						||
                            ;;
 | 
						||
        -f | --frontend )   BUILD_FRONTEND=true
 | 
						||
                            ;;
 | 
						||
        -c | --clean )      CLEAN_IMAGES=true
 | 
						||
                            ;;
 | 
						||
        -v | --version )    show_version
 | 
						||
                            ;;
 | 
						||
        * )                 log_error "未知选项: $1"
 | 
						||
                            show_help
 | 
						||
                            ;;
 | 
						||
    esac
 | 
						||
    shift
 | 
						||
done
 | 
						||
 | 
						||
# 检查Docker环境
 | 
						||
check_docker
 | 
						||
if [ $? -ne 0 ]; then
 | 
						||
    exit 1
 | 
						||
fi
 | 
						||
 | 
						||
# 检测平台
 | 
						||
check_platform
 | 
						||
 | 
						||
# 执行清理操作
 | 
						||
if [ "$CLEAN_IMAGES" = true ]; then
 | 
						||
    clean_images
 | 
						||
    exit $?
 | 
						||
fi
 | 
						||
 | 
						||
# 执行构建操作
 | 
						||
if [ "$BUILD_ALL" = true ]; then
 | 
						||
    build_all_images
 | 
						||
    exit $?
 | 
						||
fi
 | 
						||
 | 
						||
if [ "$BUILD_APP" = true ]; then
 | 
						||
    build_app_image
 | 
						||
    exit $?
 | 
						||
fi
 | 
						||
 | 
						||
if [ "$BUILD_DOCREADER" = true ]; then
 | 
						||
    build_docreader_image
 | 
						||
    exit $?
 | 
						||
fi
 | 
						||
 | 
						||
if [ "$BUILD_FRONTEND" = true ]; then
 | 
						||
    build_frontend_image
 | 
						||
    exit $?
 | 
						||
fi
 | 
						||
 | 
						||
exit 0  |