Files
WeKnora/scripts/build_images.sh

309 lines
7.8 KiB
Bash
Raw Normal View History

#!/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"
export ARCH="amd64"
elif [ "$(uname -m)" = "aarch64" ] || [ "$(uname -m)" = "arm64" ]; then
export PLATFORM="linux/arm64"
export ARCH="arm64"
else
log_warning "未识别的平台类型:$(uname -m),将使用默认平台 linux/amd64"
export PLATFORM="linux/amd64"
export ARCH="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:${ARCH}-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:${ARCH}-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:${ARCH}-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:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
docker stop $(docker ps -q --filter "ancestor=wechatopenai/weknora-docreader:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
docker stop $(docker ps -q --filter "ancestor=wechatopenai/weknora-ui:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
# 删除相关容器
log_info "删除相关容器..."
docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-app:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-docreader:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
docker rm $(docker ps -aq --filter "ancestor=wechatopenai/weknora-ui:${ARCH}-latest" 2>/dev/null) 2>/dev/null || true
# 删除镜像
log_info "删除本地镜像..."
docker rmi wechatopenai/weknora-app:${ARCH}-latest 2>/dev/null || true
docker rmi wechatopenai/weknora-docreader:${ARCH}-latest 2>/dev/null || true
docker rmi wechatopenai/weknora-ui:${ARCH}-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