#!/bin/bash # ============================================ # 智能Docker镜像构建脚本 # 根据网络环境自动选择最优镜像源 # ============================================ set -e # 配置 SERVICE=${1:-gateway} TAG=${2:-latest} REGISTRY=${3:-aliyun} # aliyun, netease, tsinghua, ustc, distroless # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 镜像源映射 declare -A REGISTRIES=( [aliyun]="registry.aliyuncs.com/library" [netease]="hub.c.163.com/library" [tsinghua]="docker.mirrors.tsinghua.edu.cn/library" [ustc]="docker.mirrors.ustc.edu.cn/library" ) # 服务映射 declare -A SERVICES=( [gateway]="gateway" [order]="order-service" [payment]="payment-service" [web]="web" ) # ============================================ # 函数定义 # ============================================ print_usage() { cat < /dev/null 2>&1; then echo -e "${GREEN}✓ $registry 可用${NC}" return 0 else echo -e "${RED}✗ $registry 不可用${NC}" return 1 fi } select_best_registry() { echo -e "${YELLOW}开始检测可用镜像源...${NC}" local registries=("aliyun" "netease" "tsinghua" "ustc") for reg in "${registries[@]}"; do if check_registry "${REGISTRIES[$reg]}"; then echo -e "${GREEN}选择镜像源: $reg${NC}" echo "$reg" return 0 fi done echo -e "${RED}所有镜像源都不可用,使用默认的阿里云${NC}" echo "aliyun" } build_image() { local service=$1 local tag=$2 local registry=$3 local registry_url=${REGISTRIES[$registry]} local service_dir="shop-recycle-${service}" if [ ! -d "$service_dir" ]; then echo -e "${RED}错误: 目录 $service_dir 不存在${NC}" exit 1 fi echo -e "${YELLOW}开始构建镜像:${NC}" echo " 服务: $service" echo " 标签: $tag" echo " 镜像源: $registry ($registry_url)" echo "" docker build \ --build-arg REGISTRY="$registry_url" \ --build-arg BUILD_NUMBER="$tag" \ --cache-from "shop-recycle/$service:latest" \ -t "shop-recycle/$service:$tag" \ -t "shop-recycle/$service:latest" \ -f "$service_dir/Dockerfile" \ . echo -e "${GREEN}✓ 镜像构建完成${NC}" # 显示镜像信息 echo "" echo -e "${YELLOW}镜像信息:${NC}" docker images | grep "shop-recycle/$service" | head -2 } # ============================================ # 主程序 # ============================================ if [ "$SERVICE" == "--help" ] || [ "$SERVICE" == "-h" ]; then print_usage exit 0 fi # 验证SERVICE参数 if [ ! -v SERVICES[$SERVICE] ]; then echo -e "${RED}错误: 未知的服务 '$SERVICE'${NC}" print_usage exit 1 fi # 处理镜像源参数 if [ "$REGISTRY" == "auto" ]; then REGISTRY=$(select_best_registry) elif [ ! -v REGISTRIES[$REGISTRY] ]; then echo -e "${RED}错误: 未知的镜像源 '$REGISTRY'${NC}" exit 1 fi # 执行构建 build_image "$SERVICE" "$TAG" "$REGISTRY" echo "" echo -e "${GREEN}====================================${NC}" echo -e "${GREEN}构建成功!${NC}" echo -e "${GREEN}镜像: shop-recycle/$SERVICE:$TAG${NC}" echo -e "${GREEN}====================================${NC}" echo "" echo -e "${YELLOW}下一步:${NC}" echo " # 推送镜像" echo " docker push shop-recycle/$SERVICE:$TAG" echo "" echo " # 运行容器" echo " docker run -d -p 8080:8080 shop-recycle/$SERVICE:$TAG" echo "" echo " # 查看日志" echo " docker logs -f \$(docker ps -q -f ancestor=shop-recycle/$SERVICE:$TAG)"