# ================================================ # Urban Lifeline - Docker 构建管理 Makefile # ================================================ # 使用方法: # make help - 显示帮助信息 # make build-all - 构建所有镜像 # make build-serv - 构建所有后端服务镜像 # make build-gateway - 构建单个服务镜像 # make save-all - 导出所有镜像 # make up - 启动所有服务 # make down - 停止所有服务 # ================================================ # 项目根目录(docker 目录的上级) PROJECT_ROOT := $(shell cd .. && pwd) DOCKER_DIR := $(shell pwd) # 镜像版本 IMAGE_VERSION ?= $(shell date +%Y%m%d_%H%M%S) IMAGE_REGISTRY ?= # 服务列表 SERV_SERVICES := gateway system auth file ai workcase WEB_SERVICES := platform workcase-web # 服务端口映射 PORT_gateway := 8080 PORT_system := 8082 PORT_auth := 8081 PORT_file := 8084 PORT_ai := 8090 PORT_workcase := 8088 # 输出目录 BUILD_OUTPUT := $(DOCKER_DIR)/output # 颜色定义 COLOR_RESET := \033[0m COLOR_GREEN := \033[0;32m COLOR_YELLOW := \033[0;33m COLOR_BLUE := \033[0;34m COLOR_RED := \033[0;31m # ================================================ # 帮助信息 # ================================================ .PHONY: help help: @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" @echo "$(COLOR_BLUE) Urban Lifeline Docker 构建管理$(COLOR_RESET)" @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" @echo "" @echo "$(COLOR_GREEN)构建命令:$(COLOR_RESET)" @echo " make build-base - 构建基础镜像" @echo " make build-all - 构建所有镜像" @echo " make build-serv - 构建所有后端服务镜像" @echo " make build-web - 构建前端镜像" @echo " make build- - 构建单个服务 (gateway/system/auth/file/ai/workcase)" @echo "" @echo "$(COLOR_GREEN)编译命令:$(COLOR_RESET)" @echo " make compile-serv - 编译所有后端服务" @echo " make compile- - 编译单个后端服务" @echo " make compile-web - 编译所有前端项目" @echo "" @echo "$(COLOR_GREEN)导出命令:$(COLOR_RESET)" @echo " make save-all - 导出所有镜像到 tar 文件" @echo " make save-serv - 导出所有后端镜像" @echo " make save- - 导出单个服务镜像" @echo "" @echo "$(COLOR_GREEN)运行命令:$(COLOR_RESET)" @echo " make up - 启动所有服务" @echo " make up-infra - 启动基础设施 (nacos/minio/jitsi)" @echo " make up-serv - 启动后端服务" @echo " make up-web - 启动前端服务" @echo " make down - 停止所有服务" @echo " make logs - 查看所有日志" @echo " make status - 查看服务状态" @echo "" @echo "$(COLOR_GREEN)清理命令:$(COLOR_RESET)" @echo " make clean - 清理构建产物" @echo " make clean-images - 清理 Docker 镜像" @echo "" @echo "$(COLOR_YELLOW)当前版本: $(IMAGE_VERSION)$(COLOR_RESET)" @echo "" # ================================================ # 初始化 # ================================================ .PHONY: init init: @mkdir -p $(BUILD_OUTPUT) @mkdir -p $(DOCKER_DIR)/volumes/logs # ================================================ # 编译后端服务 # ================================================ .PHONY: compile-serv compile-serv: @echo "$(COLOR_YELLOW)编译所有后端服务...$(COLOR_RESET)" @cd $(PROJECT_ROOT)/urbanLifelineServ && mvn clean package -DskipTests @echo "$(COLOR_GREEN)✓ 后端服务编译完成$(COLOR_RESET)" .PHONY: $(addprefix compile-,$(SERV_SERVICES)) $(addprefix compile-,$(SERV_SERVICES)): compile-%: @echo "$(COLOR_YELLOW)编译 $* 服务...$(COLOR_RESET)" @cd $(PROJECT_ROOT)/urbanLifelineServ && mvn clean package -DskipTests -pl $* -am @echo "$(COLOR_GREEN)✓ $* 服务编译完成$(COLOR_RESET)" # ================================================ # 编译前端项目 # ================================================ .PHONY: compile-web compile-web: @echo "$(COLOR_YELLOW)编译前端项目...$(COLOR_RESET)" @cd $(PROJECT_ROOT)/urbanLifelineWeb && pnpm install && pnpm run build:all @echo "$(COLOR_GREEN)✓ 前端项目编译完成$(COLOR_RESET)" .PHONY: compile-platform compile-platform: @echo "$(COLOR_YELLOW)编译 platform 项目...$(COLOR_RESET)" @cd $(PROJECT_ROOT)/urbanLifelineWeb/packages/platform && pnpm run build @echo "$(COLOR_GREEN)✓ platform 编译完成$(COLOR_RESET)" .PHONY: compile-workcase compile-workcase-web: @echo "$(COLOR_YELLOW)编译 workcase 项目...$(COLOR_RESET)" @cd $(PROJECT_ROOT)/urbanLifelineWeb/packages/workcase && pnpm run build @echo "$(COLOR_GREEN)✓ workcase 编译完成$(COLOR_RESET)" # ================================================ # 构建 Docker 镜像 # ================================================ .PHONY: build-base build-base: @echo "$(COLOR_YELLOW)构建基础镜像...$(COLOR_RESET)" @cd $(PROJECT_ROOT) && docker build \ -t urban-lifeline-base-serv:$(IMAGE_VERSION) \ -t urban-lifeline-base-serv:latest \ -f docker/urbanLifeline/serv/Dockerfile.base . @echo "$(COLOR_GREEN)✓ 基础镜像构建完成$(COLOR_RESET)" .PHONY: build-all build-all: build-base build-serv build-web @echo "$(COLOR_GREEN)✓ 所有镜像构建完成$(COLOR_RESET)" .PHONY: build-serv build-serv: $(addprefix build-,$(SERV_SERVICES)) @echo "$(COLOR_GREEN)✓ 所有后端服务镜像构建完成$(COLOR_RESET)" # 构建单个后端服务镜像 .PHONY: $(addprefix build-,$(SERV_SERVICES)) $(addprefix build-,$(SERV_SERVICES)): build-%: @echo "$(COLOR_YELLOW)构建 $* 服务镜像...$(COLOR_RESET)" @if [ ! -f "$(PROJECT_ROOT)/urbanLifelineServ/$*/target/$*-*.jar" ] && \ [ ! -f "$(PROJECT_ROOT)/urbanLifelineServ/$*/target/*.jar" ]; then \ echo "$(COLOR_RED)✗ JAR 包不存在,请先执行 make compile-$*$(COLOR_RESET)"; \ exit 1; \ fi @cd $(PROJECT_ROOT) && docker build \ --build-arg SERVICE_NAME=$* \ --build-arg SERVICE_PORT=$(PORT_$*) \ -t urban-lifeline-$*:$(IMAGE_VERSION) \ -t urban-lifeline-$*:latest \ -f docker/urbanLifeline/serv/Dockerfile.template . @echo "$(COLOR_GREEN)✓ $* 镜像构建完成: urban-lifeline-$*:$(IMAGE_VERSION)$(COLOR_RESET)" .PHONY: build-web build-web: build-platform build-workcase-web @echo "$(COLOR_GREEN)✓ 所有前端镜像构建完成$(COLOR_RESET)" .PHONY: build-platform build-platform: @echo "$(COLOR_YELLOW)构建 platform 镜像...$(COLOR_RESET)" @if [ ! -d "$(PROJECT_ROOT)/urbanLifelineWeb/packages/platform/dist" ]; then \ echo "$(COLOR_RED)✗ platform dist 不存在,请先执行 make compile-web$(COLOR_RESET)"; \ 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 . @echo "$(COLOR_GREEN)✓ platform 镜像构建完成$(COLOR_RESET)" .PHONY: build-workcase-web build-workcase-web: @echo "$(COLOR_YELLOW)构建 workcase-web 镜像...$(COLOR_RESET)" @if [ ! -d "$(PROJECT_ROOT)/urbanLifelineWeb/packages/workcase/dist" ]; then \ echo "$(COLOR_RED)✗ workcase dist 不存在,请先执行 make compile-web$(COLOR_RESET)"; \ 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 . @echo "$(COLOR_GREEN)✓ workcase-web 镜像构建完成$(COLOR_RESET)" # ================================================ # 导出镜像 # ================================================ .PHONY: save-all save-all: init save-serv save-web @echo "$(COLOR_GREEN)✓ 所有镜像导出完成$(COLOR_RESET)" @echo "输出目录: $(BUILD_OUTPUT)" @ls -lh $(BUILD_OUTPUT)/*.tar 2>/dev/null || true .PHONY: save-serv save-serv: $(addprefix save-,$(SERV_SERVICES)) @echo "$(COLOR_GREEN)✓ 所有后端镜像导出完成$(COLOR_RESET)" .PHONY: $(addprefix save-,$(SERV_SERVICES)) $(addprefix save-,$(SERV_SERVICES)): save-%: init @echo "$(COLOR_YELLOW)导出 $* 镜像...$(COLOR_RESET)" @docker save -o $(BUILD_OUTPUT)/urban-lifeline-$*_$(IMAGE_VERSION).tar \ urban-lifeline-$*:$(IMAGE_VERSION) @echo "$(COLOR_GREEN)✓ $* 镜像已导出: $(BUILD_OUTPUT)/urban-lifeline-$*_$(IMAGE_VERSION).tar$(COLOR_RESET)" .PHONY: save-web save-web: save-platform save-workcase-web @echo "$(COLOR_GREEN)✓ 所有前端镜像导出完成$(COLOR_RESET)" .PHONY: save-platform save-platform: init @echo "$(COLOR_YELLOW)导出 platform 镜像...$(COLOR_RESET)" @docker save -o $(BUILD_OUTPUT)/urban-lifeline-platform_$(IMAGE_VERSION).tar \ urban-lifeline-platform:$(IMAGE_VERSION) @echo "$(COLOR_GREEN)✓ platform 镜像已导出$(COLOR_RESET)" .PHONY: save-workcase-web save-workcase-web: init @echo "$(COLOR_YELLOW)导出 workcase-web 镜像...$(COLOR_RESET)" @docker save -o $(BUILD_OUTPUT)/urban-lifeline-workcase-web_$(IMAGE_VERSION).tar \ urban-lifeline-workcase-web:$(IMAGE_VERSION) @echo "$(COLOR_GREEN)✓ workcase-web 镜像已导出$(COLOR_RESET)" .PHONY: save-base save-base: init @echo "$(COLOR_YELLOW)导出基础镜像...$(COLOR_RESET)" @docker save -o $(BUILD_OUTPUT)/urban-lifeline-base-serv_$(IMAGE_VERSION).tar \ urban-lifeline-base-serv:$(IMAGE_VERSION) @echo "$(COLOR_GREEN)✓ 基础镜像已导出$(COLOR_RESET)" # ================================================ # Docker Compose 操作 # ================================================ .PHONY: up up: @echo "$(COLOR_YELLOW)启动所有服务...$(COLOR_RESET)" @docker compose --profile all up -d @echo "$(COLOR_GREEN)✓ 所有服务已启动$(COLOR_RESET)" .PHONY: up-infra up-infra: @echo "$(COLOR_YELLOW)启动基础设施...$(COLOR_RESET)" @docker compose --profile infra up -d @echo "$(COLOR_GREEN)✓ 基础设施已启动$(COLOR_RESET)" .PHONY: up-serv up-serv: @echo "$(COLOR_YELLOW)启动后端服务...$(COLOR_RESET)" @docker compose --profile serv up -d @echo "$(COLOR_GREEN)✓ 后端服务已启动$(COLOR_RESET)" .PHONY: up-web up-web: @echo "$(COLOR_YELLOW)前端已集成到 Nginx (infra),请使用 make up-infra$(COLOR_RESET)" .PHONY: down down: @echo "$(COLOR_YELLOW)停止所有服务...$(COLOR_RESET)" @docker compose --profile all down @echo "$(COLOR_GREEN)✓ 所有服务已停止$(COLOR_RESET)" .PHONY: restart restart: down up @echo "$(COLOR_GREEN)✓ 所有服务已重启$(COLOR_RESET)" .PHONY: logs logs: @docker compose logs -f .PHONY: status status: @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" @echo "$(COLOR_BLUE) 服务运行状态$(COLOR_RESET)" @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" @docker compose ps # ================================================ # 清理 # ================================================ .PHONY: clean clean: @echo "$(COLOR_YELLOW)清理构建产物...$(COLOR_RESET)" @rm -rf $(BUILD_OUTPUT) @echo "$(COLOR_GREEN)✓ 清理完成$(COLOR_RESET)" .PHONY: clean-images clean-images: @echo "$(COLOR_YELLOW)清理 Docker 镜像...$(COLOR_RESET)" @docker images | grep "urban-lifeline" | awk '{print $$3}' | xargs -r docker rmi -f @echo "$(COLOR_GREEN)✓ 镜像清理完成$(COLOR_RESET)" # ================================================ # 快捷命令 # ================================================ .PHONY: full-build full-build: compile-serv compile-web build-all @echo "$(COLOR_GREEN)✓ 完整构建完成$(COLOR_RESET)" .PHONY: full-deploy full-deploy: full-build save-all @echo "$(COLOR_GREEN)✓ 完整部署包准备完成$(COLOR_RESET)" @echo "输出目录: $(BUILD_OUTPUT)" # 默认目标 .DEFAULT_GOAL := help