build-docker.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #!/bin/bash
  2. # ============================================
  3. # 智能Docker镜像构建脚本
  4. # 根据网络环境自动选择最优镜像源
  5. # ============================================
  6. set -e
  7. # 配置
  8. SERVICE=${1:-gateway}
  9. TAG=${2:-latest}
  10. REGISTRY=${3:-aliyun} # aliyun, netease, tsinghua, ustc, distroless
  11. # 颜色输出
  12. RED='\033[0;31m'
  13. GREEN='\033[0;32m'
  14. YELLOW='\033[1;33m'
  15. NC='\033[0m'
  16. # 镜像源映射
  17. declare -A REGISTRIES=(
  18. [aliyun]="registry.aliyuncs.com/library"
  19. [netease]="hub.c.163.com/library"
  20. [tsinghua]="docker.mirrors.tsinghua.edu.cn/library"
  21. [ustc]="docker.mirrors.ustc.edu.cn/library"
  22. )
  23. # 服务映射
  24. declare -A SERVICES=(
  25. [gateway]="gateway"
  26. [order]="order-service"
  27. [payment]="payment-service"
  28. [web]="web"
  29. )
  30. # ============================================
  31. # 函数定义
  32. # ============================================
  33. print_usage() {
  34. cat <<EOF
  35. 使用方法: $0 [SERVICE] [TAG] [REGISTRY]
  36. 参数:
  37. SERVICE - 服务名称 (gateway|order|payment|web) [默认: gateway]
  38. TAG - 镜像标签 [默认: latest]
  39. REGISTRY - 镜像源 (aliyun|netease|tsinghua|ustc) [默认: aliyun]
  40. 示例:
  41. # 构建gateway镜像,使用阿里云源
  42. $0 gateway latest aliyun
  43. # 构建order-service镜像,使用网易云源
  44. $0 order 1.0.0 netease
  45. # 构建payment-service镜像,使用清华源
  46. $0 payment v1.0.0-001 tsinghua
  47. # 构建web前端镜像
  48. $0 web latest aliyun
  49. # 智能选择镜像源(自动检测最快源)
  50. $0 gateway latest auto
  51. EOF
  52. }
  53. check_registry() {
  54. local registry=$1
  55. local test_url="https://${registry}/library/maven"
  56. echo -e "${YELLOW}检查镜像源: ${registry}${NC}"
  57. if timeout 5 curl -I --silent "$test_url" > /dev/null 2>&1; then
  58. echo -e "${GREEN}✓ $registry 可用${NC}"
  59. return 0
  60. else
  61. echo -e "${RED}✗ $registry 不可用${NC}"
  62. return 1
  63. fi
  64. }
  65. select_best_registry() {
  66. echo -e "${YELLOW}开始检测可用镜像源...${NC}"
  67. local registries=("aliyun" "netease" "tsinghua" "ustc")
  68. for reg in "${registries[@]}"; do
  69. if check_registry "${REGISTRIES[$reg]}"; then
  70. echo -e "${GREEN}选择镜像源: $reg${NC}"
  71. echo "$reg"
  72. return 0
  73. fi
  74. done
  75. echo -e "${RED}所有镜像源都不可用,使用默认的阿里云${NC}"
  76. echo "aliyun"
  77. }
  78. build_image() {
  79. local service=$1
  80. local tag=$2
  81. local registry=$3
  82. local registry_url=${REGISTRIES[$registry]}
  83. local service_dir="shop-recycle-${service}"
  84. if [ ! -d "$service_dir" ]; then
  85. echo -e "${RED}错误: 目录 $service_dir 不存在${NC}"
  86. exit 1
  87. fi
  88. echo -e "${YELLOW}开始构建镜像:${NC}"
  89. echo " 服务: $service"
  90. echo " 标签: $tag"
  91. echo " 镜像源: $registry ($registry_url)"
  92. echo ""
  93. docker build \
  94. --build-arg REGISTRY="$registry_url" \
  95. --build-arg BUILD_NUMBER="$tag" \
  96. --cache-from "shop-recycle/$service:latest" \
  97. -t "shop-recycle/$service:$tag" \
  98. -t "shop-recycle/$service:latest" \
  99. -f "$service_dir/Dockerfile" \
  100. .
  101. echo -e "${GREEN}✓ 镜像构建完成${NC}"
  102. # 显示镜像信息
  103. echo ""
  104. echo -e "${YELLOW}镜像信息:${NC}"
  105. docker images | grep "shop-recycle/$service" | head -2
  106. }
  107. # ============================================
  108. # 主程序
  109. # ============================================
  110. if [ "$SERVICE" == "--help" ] || [ "$SERVICE" == "-h" ]; then
  111. print_usage
  112. exit 0
  113. fi
  114. # 验证SERVICE参数
  115. if [ ! -v SERVICES[$SERVICE] ]; then
  116. echo -e "${RED}错误: 未知的服务 '$SERVICE'${NC}"
  117. print_usage
  118. exit 1
  119. fi
  120. # 处理镜像源参数
  121. if [ "$REGISTRY" == "auto" ]; then
  122. REGISTRY=$(select_best_registry)
  123. elif [ ! -v REGISTRIES[$REGISTRY] ]; then
  124. echo -e "${RED}错误: 未知的镜像源 '$REGISTRY'${NC}"
  125. exit 1
  126. fi
  127. # 执行构建
  128. build_image "$SERVICE" "$TAG" "$REGISTRY"
  129. echo ""
  130. echo -e "${GREEN}====================================${NC}"
  131. echo -e "${GREEN}构建成功!${NC}"
  132. echo -e "${GREEN}镜像: shop-recycle/$SERVICE:$TAG${NC}"
  133. echo -e "${GREEN}====================================${NC}"
  134. echo ""
  135. echo -e "${YELLOW}下一步:${NC}"
  136. echo " # 推送镜像"
  137. echo " docker push shop-recycle/$SERVICE:$TAG"
  138. echo ""
  139. echo " # 运行容器"
  140. echo " docker run -d -p 8080:8080 shop-recycle/$SERVICE:$TAG"
  141. echo ""
  142. echo " # 查看日志"
  143. echo " docker logs -f \$(docker ps -q -f ancestor=shop-recycle/$SERVICE:$TAG)"