#!/bin/bash # Sanguo VeighNa 分层构建脚本 # 用法: ./docker/build.sh [base|app|all|clean] set -e # 配置 PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" REGISTRY="${REGISTRY:-sanguo_vnpy}" BASE_TAG="${REGISTRY}:base" APP_TAG="${REGISTRY}:latest" # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' 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" } # 检查 Docker check_docker() { if ! command -v docker &> /dev/null; then log_error "Docker 未安装" exit 1 fi log_info "Docker 版本: $(docker --version)" } # 构建基础镜像 build_base() { log_info "开始构建基础镜像..." log_info "预计时间: 20-30 分钟" cd "$PROJECT_DIR" docker build \ -f docker/Dockerfile.base \ -t "$BASE_TAG" \ --build-arg PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \ --build-arg PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn \ . log_info "基础镜像构建完成: $BASE_TAG" docker images "$BASE_TAG" } # 构建应用镜像 build_app() { log_info "开始构建应用镜像..." log_info "预计时间: 3-5 分钟" cd "$PROJECT_DIR" # 检查基础镜像 if ! docker image inspect "$BASE_TAG" &> /dev/null; then log_warn "基础镜像不存在,先构建基础镜像" build_base fi docker build \ -f docker/Dockerfile.nas \ -t "$APP_TAG" \ . log_info "应用镜像构建完成: $APP_TAG" docker images "$APP_TAG" } # 全量构建 build_all() { log_info "开始全量构建..." build_base build_app } # 清理旧镜像 clean_images() { log_info "清理旧镜像..." # 删除悬空镜像 docker image prune -f # 询问是否删除旧版本 read -p "是否删除旧版本镜像? (y/N) " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then docker images "$REGISTRY" --format "{{.ID}} {{.Tag}}" | \ grep -v "$BASE_TAG\|$APP_TAG" | \ awk '{print $1}' | \ xargs -r docker rmi log_info "旧镜像已清理" fi } # 显示帮助 show_help() { cat << EOF Sanguo VeighNa 分层构建脚本 用法: $0 [命令] 命令: base 构建基础镜像 (依赖层,约30分钟) app 构建应用镜像 (应用层,约5分钟) all 全量构建 (base + app) clean 清理旧镜像 help 显示此帮助 示例: $0 base # 首次构建或依赖更新时 $0 app # 代码更新后快速重建 $0 all # 完整构建 $0 clean # 清理旧镜像 环境变量: REGISTRY 镜像前缀 (默认: sanguo_vnpy) EOF } # 主逻辑 main() { check_docker case "${1:-help}" in base) build_base ;; app) build_app ;; all) build_all ;; clean) clean_images ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } main "$@"