docker初步构想
This commit is contained in:
381
docker/build.sh
Normal file
381
docker/build.sh
Normal file
@@ -0,0 +1,381 @@
|
||||
#!/bin/bash
|
||||
|
||||
##############################################
|
||||
# Urban Lifeline - 构建和打包脚本
|
||||
#
|
||||
# 功能:
|
||||
# 1. 编译后端/前端项目
|
||||
# 2. 构建 Docker 镜像
|
||||
# 3. 导出镜像到 tar 文件
|
||||
#
|
||||
# 使用方法:
|
||||
# ./build.sh [target] [options]
|
||||
#
|
||||
# 目标(target):
|
||||
# base - 构建基础镜像
|
||||
# serv - 构建所有后端服务镜像
|
||||
# web - 构建前端镜像
|
||||
# all - 构建所有镜像(默认)
|
||||
# gateway - 构建单个后端服务
|
||||
# system/auth/file/ai/workcase - 同上
|
||||
#
|
||||
# 选项(options):
|
||||
# compile - 先编译代码再构建镜像
|
||||
# save - 构建后导出镜像到 tar 文件
|
||||
# save=VERSION - 导出指定版本的镜像
|
||||
#
|
||||
# 示例:
|
||||
# ./build.sh all compile save # 编译+构建+导出所有
|
||||
# ./build.sh gateway compile # 编译+构建 gateway
|
||||
# ./build.sh serv save # 构建+导出所有后端
|
||||
# ./build.sh web compile save # 编译+构建+导出前端
|
||||
##############################################
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||
log_step() { echo -e "${BLUE}[STEP]${NC} $1"; }
|
||||
|
||||
# 项目路径
|
||||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
PROJECT_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
|
||||
DOCKER_DIR="${SCRIPT_DIR}"
|
||||
BUILD_OUTPUT="${DOCKER_DIR}/output"
|
||||
IMAGE_VERSION=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# 服务列表
|
||||
SERV_SERVICES="gateway system auth file ai workcase"
|
||||
|
||||
# 服务端口映射
|
||||
declare -A SERVICE_PORTS=(
|
||||
["gateway"]=8080
|
||||
["system"]=8082
|
||||
["auth"]=8081
|
||||
["file"]=8084
|
||||
["ai"]=8090
|
||||
["workcase"]=8088
|
||||
)
|
||||
|
||||
# 解析参数
|
||||
BUILD_TARGET="${1:-all}"
|
||||
shift || true
|
||||
|
||||
DO_COMPILE=false
|
||||
DO_SAVE=false
|
||||
SAVE_VERSION=""
|
||||
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
compile)
|
||||
DO_COMPILE=true
|
||||
;;
|
||||
save)
|
||||
DO_SAVE=true
|
||||
;;
|
||||
save=*)
|
||||
DO_SAVE=true
|
||||
SAVE_VERSION="${arg#save=}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 确定保存版本
|
||||
if [ "${DO_SAVE}" = true ] && [ -z "${SAVE_VERSION}" ]; then
|
||||
SAVE_VERSION="${IMAGE_VERSION}"
|
||||
fi
|
||||
|
||||
echo "=========================================="
|
||||
echo "Urban Lifeline - 构建脚本"
|
||||
echo "=========================================="
|
||||
log_info "构建目标: ${BUILD_TARGET}"
|
||||
log_info "构建版本: ${IMAGE_VERSION}"
|
||||
log_info "编译代码: ${DO_COMPILE}"
|
||||
log_info "保存镜像: ${DO_SAVE}"
|
||||
[ "${DO_SAVE}" = true ] && log_info "保存版本: ${SAVE_VERSION}"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
mkdir -p "${BUILD_OUTPUT}"
|
||||
|
||||
# ================================================
|
||||
# 编译函数
|
||||
# ================================================
|
||||
|
||||
compile_serv_all() {
|
||||
log_step "编译所有后端服务"
|
||||
cd "${PROJECT_ROOT}/urbanLifelineServ"
|
||||
mvn clean package -DskipTests
|
||||
log_info "✅ 后端服务编译完成"
|
||||
}
|
||||
|
||||
compile_serv_single() {
|
||||
local service=$1
|
||||
log_step "编译 ${service} 服务"
|
||||
cd "${PROJECT_ROOT}/urbanLifelineServ"
|
||||
mvn clean package -DskipTests -pl ${service} -am
|
||||
log_info "✅ ${service} 服务编译完成"
|
||||
}
|
||||
|
||||
compile_web() {
|
||||
log_step "编译前端项目"
|
||||
cd "${PROJECT_ROOT}/urbanLifelineWeb"
|
||||
|
||||
# 检查 pnpm
|
||||
if command -v pnpm &> /dev/null; then
|
||||
pnpm install
|
||||
pnpm run build:all 2>/dev/null || {
|
||||
# 如果没有 build:all 脚本,分别构建
|
||||
log_info "分别构建各前端项目..."
|
||||
cd packages/shared && pnpm run build && cd ../..
|
||||
cd packages/platform && pnpm run build && cd ../..
|
||||
cd packages/workcase && pnpm run build && cd ../..
|
||||
}
|
||||
else
|
||||
npm install
|
||||
npm run build:all 2>/dev/null || {
|
||||
cd packages/shared && npm run build && cd ../..
|
||||
cd packages/platform && npm run build && cd ../..
|
||||
cd packages/workcase && npm run build && cd ../..
|
||||
}
|
||||
fi
|
||||
log_info "✅ 前端项目编译完成"
|
||||
}
|
||||
|
||||
# ================================================
|
||||
# 构建函数
|
||||
# ================================================
|
||||
|
||||
build_base() {
|
||||
log_step "构建基础镜像"
|
||||
cd "${PROJECT_ROOT}"
|
||||
docker build \
|
||||
-t urban-lifeline-base-serv:${IMAGE_VERSION} \
|
||||
-t urban-lifeline-base-serv:latest \
|
||||
-f docker/urbanLifeline/serv/Dockerfile.base .
|
||||
log_info "✅ 基础镜像构建完成: urban-lifeline-base-serv:${IMAGE_VERSION}"
|
||||
}
|
||||
|
||||
build_serv_single() {
|
||||
local service=$1
|
||||
local port=${SERVICE_PORTS[$service]}
|
||||
|
||||
log_step "构建 ${service} 服务镜像"
|
||||
|
||||
# 检查 JAR 包
|
||||
local jar_file=$(find "${PROJECT_ROOT}/urbanLifelineServ/${service}/target" -name "*.jar" -type f 2>/dev/null | head -1)
|
||||
if [ -z "$jar_file" ]; then
|
||||
log_error "JAR 包不存在,请先编译: ./build.sh ${service} compile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PROJECT_ROOT}"
|
||||
docker build \
|
||||
--build-arg SERVICE_NAME=${service} \
|
||||
--build-arg SERVICE_PORT=${port} \
|
||||
-t urban-lifeline-${service}:${IMAGE_VERSION} \
|
||||
-t urban-lifeline-${service}:latest \
|
||||
-f docker/urbanLifeline/serv/Dockerfile.template .
|
||||
|
||||
log_info "✅ ${service} 镜像构建完成: urban-lifeline-${service}:${IMAGE_VERSION}"
|
||||
}
|
||||
|
||||
build_serv_all() {
|
||||
for service in ${SERV_SERVICES}; do
|
||||
build_serv_single ${service}
|
||||
done
|
||||
log_info "✅ 所有后端服务镜像构建完成"
|
||||
}
|
||||
|
||||
build_web() {
|
||||
build_platform
|
||||
build_workcase_web
|
||||
log_info "✅ 所有前端镜像构建完成"
|
||||
}
|
||||
|
||||
build_platform() {
|
||||
log_step "构建 platform 镜像"
|
||||
|
||||
if [ ! -d "${PROJECT_ROOT}/urbanLifelineWeb/packages/platform/dist" ]; then
|
||||
log_error "platform dist 不存在,请先编译: ./build.sh platform compile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PROJECT_ROOT}"
|
||||
docker build \
|
||||
--build-arg WEB_NAME=platform \
|
||||
-t urban-lifeline-platform:${IMAGE_VERSION} \
|
||||
-t urban-lifeline-platform:latest \
|
||||
-f docker/urbanLifeline/web/Dockerfile .
|
||||
|
||||
log_info "✅ platform 镜像构建完成: urban-lifeline-platform:${IMAGE_VERSION}"
|
||||
}
|
||||
|
||||
build_workcase_web() {
|
||||
log_step "构建 workcase-web 镜像"
|
||||
|
||||
if [ ! -d "${PROJECT_ROOT}/urbanLifelineWeb/packages/workcase/dist" ]; then
|
||||
log_error "workcase dist 不存在,请先编译: ./build.sh workcase-web compile"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PROJECT_ROOT}"
|
||||
docker build \
|
||||
--build-arg WEB_NAME=workcase \
|
||||
-t urban-lifeline-workcase-web:${IMAGE_VERSION} \
|
||||
-t urban-lifeline-workcase-web:latest \
|
||||
-f docker/urbanLifeline/web/Dockerfile .
|
||||
|
||||
log_info "✅ workcase-web 镜像构建完成: urban-lifeline-workcase-web:${IMAGE_VERSION}"
|
||||
}
|
||||
|
||||
# ================================================
|
||||
# 导出函数
|
||||
# ================================================
|
||||
|
||||
save_image() {
|
||||
local image_name=$1
|
||||
local version=${SAVE_VERSION}
|
||||
local output_file="${BUILD_OUTPUT}/${image_name}_${version}.tar"
|
||||
|
||||
log_info "导出镜像: ${image_name}:${version}"
|
||||
|
||||
if ! docker images | grep -q "${image_name}.*${version}"; then
|
||||
log_error "镜像不存在: ${image_name}:${version}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
docker save -o "${output_file}" ${image_name}:${version}
|
||||
local size=$(du -h "${output_file}" | cut -f1)
|
||||
log_info "✅ 镜像已导出: ${output_file} (${size})"
|
||||
}
|
||||
|
||||
save_serv_all() {
|
||||
for service in ${SERV_SERVICES}; do
|
||||
save_image "urban-lifeline-${service}"
|
||||
done
|
||||
}
|
||||
|
||||
# ================================================
|
||||
# 主流程
|
||||
# ================================================
|
||||
|
||||
main() {
|
||||
# 编译
|
||||
if [ "${DO_COMPILE}" = true ]; then
|
||||
case ${BUILD_TARGET} in
|
||||
base)
|
||||
# 基础镜像不需要编译
|
||||
;;
|
||||
serv)
|
||||
compile_serv_all
|
||||
;;
|
||||
web)
|
||||
compile_web
|
||||
;;
|
||||
all)
|
||||
compile_serv_all
|
||||
compile_web
|
||||
;;
|
||||
gateway|system|auth|file|ai|workcase)
|
||||
compile_serv_single ${BUILD_TARGET}
|
||||
;;
|
||||
*)
|
||||
log_error "未知目标: ${BUILD_TARGET}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# 构建镜像
|
||||
case ${BUILD_TARGET} in
|
||||
base)
|
||||
build_base
|
||||
;;
|
||||
serv)
|
||||
build_serv_all
|
||||
;;
|
||||
web)
|
||||
build_web
|
||||
;;
|
||||
platform)
|
||||
build_platform
|
||||
;;
|
||||
workcase-web)
|
||||
build_workcase_web
|
||||
;;
|
||||
all)
|
||||
# 检查基础镜像
|
||||
if ! docker images | grep -q "urban-lifeline-base-serv.*latest"; then
|
||||
log_warn "基础镜像不存在,先构建基础镜像"
|
||||
build_base
|
||||
fi
|
||||
build_serv_all
|
||||
build_web
|
||||
;;
|
||||
gateway|system|auth|file|ai|workcase)
|
||||
build_serv_single ${BUILD_TARGET}
|
||||
;;
|
||||
*)
|
||||
log_error "未知目标: ${BUILD_TARGET}"
|
||||
echo ""
|
||||
echo "可用目标: base, serv, web, all, gateway, system, auth, file, ai, workcase, platform, workcase-web"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# 导出镜像
|
||||
if [ "${DO_SAVE}" = true ]; then
|
||||
case ${BUILD_TARGET} in
|
||||
base)
|
||||
save_image "urban-lifeline-base-serv"
|
||||
;;
|
||||
serv)
|
||||
save_serv_all
|
||||
;;
|
||||
web)
|
||||
save_image "urban-lifeline-platform"
|
||||
save_image "urban-lifeline-workcase-web"
|
||||
;;
|
||||
platform)
|
||||
save_image "urban-lifeline-platform"
|
||||
;;
|
||||
workcase-web)
|
||||
save_image "urban-lifeline-workcase-web"
|
||||
;;
|
||||
all)
|
||||
save_image "urban-lifeline-base-serv"
|
||||
save_serv_all
|
||||
save_image "urban-lifeline-platform"
|
||||
save_image "urban-lifeline-workcase-web"
|
||||
;;
|
||||
gateway|system|auth|file|ai|workcase)
|
||||
save_image "urban-lifeline-${BUILD_TARGET}"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
log_info "导出文件列表:"
|
||||
ls -lh "${BUILD_OUTPUT}"/*.tar 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 显示镜像列表
|
||||
echo ""
|
||||
log_info "Docker 镜像列表:"
|
||||
docker images | grep "urban-lifeline" | head -20
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
log_info "✅ 构建完成!"
|
||||
echo "=========================================="
|
||||
}
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user