build.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #!/bin/bash
  2. set -e
  3. # ========== 配置 ==========
  4. PROJECT_DIR=$(cd "$(dirname "$0")" && pwd)
  5. VERSION='1.2.1'
  6. ENV='dev'
  7. MODULE='aitori-bi-v2'
  8. REGISTRY='registry.cn-shenzhen.aliyuncs.com/bantbox'
  9. REMOTE_DEV="root@192.168.0.155"
  10. REMOTE_TEST="root@34.146.228.227"
  11. REMOTE_PRO="root@34.146.222.45"
  12. # ========== 函数 ==========
  13. usage() {
  14. echo ""
  15. echo "Usage:"
  16. echo " $0 [-e env] [-v version] [-h]"
  17. echo ""
  18. echo "Options:"
  19. echo " -e 部署环境 (dev/test/pro),默认: dev"
  20. echo " -v 镜像版本号,默认: 1.2.1"
  21. echo " -h 显示帮助"
  22. echo ""
  23. }
  24. docker_login() {
  25. echo "[+] Docker login..."
  26. docker login --username=arche@1030463161912241 --password=bantbox@2021 registry.cn-shenzhen.aliyuncs.com
  27. }
  28. build_image() {
  29. local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}"
  30. echo "[+] ================================"
  31. echo "[+] 开始构建镜像..."
  32. echo "[+] 环境: ${ENV}"
  33. echo "[+] 版本: ${VERSION}"
  34. echo "[+] 镜像: ${IMAGE_TAG}"
  35. echo "[+] ================================"
  36. cd "$PROJECT_DIR"
  37. docker build \
  38. --build-arg ACTIVE_ENV="${ENV}" \
  39. -t "${MODULE}:${VERSION}" \
  40. -t "${IMAGE_TAG}" \
  41. .
  42. echo "[+] 推送镜像: ${IMAGE_TAG}"
  43. docker push "${IMAGE_TAG}"
  44. echo "[+] 构建完成"
  45. echo "[+] ================================"
  46. }
  47. restart_app() {
  48. local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}"
  49. local REMOTE=""
  50. local MEMORY_LIMIT="-m 2g"
  51. local MYSQL_HOST=""
  52. local MYSQL_PORT="3306"
  53. local MYSQL_DATABASE="aitori"
  54. local MYSQL_USERNAME="root"
  55. local MYSQL_PASSWORD=""
  56. local REDIS_HOST=""
  57. local REDIS_PORT="6379"
  58. local REDIS_PASSWORD=""
  59. local REDIS_DATABASE="1"
  60. case $ENV in
  61. dev)
  62. REMOTE=$REMOTE_DEV
  63. MYSQL_HOST="127.0.0.1"
  64. MYSQL_PASSWORD=""
  65. REDIS_HOST="127.0.0.1"
  66. REDIS_PASSWORD=""
  67. ;;
  68. test)
  69. REMOTE=$REMOTE_TEST
  70. MYSQL_HOST="10.146.0.2"
  71. MYSQL_PASSWORD='mysql@aitori!@#'
  72. REDIS_HOST="10.146.0.2"
  73. REDIS_PASSWORD='redis@aitori!@#'
  74. ;;
  75. pro)
  76. REMOTE=$REMOTE_PRO
  77. MEMORY_LIMIT=""
  78. MYSQL_HOST="35.189.132.138"
  79. MYSQL_PASSWORD='mysql@aitori!@#'
  80. REDIS_HOST="10.146.0.3"
  81. REDIS_PASSWORD='redis@aitori!@#'
  82. ;;
  83. *)
  84. echo "[-] 未知环境: $ENV"
  85. exit 1
  86. ;;
  87. esac
  88. echo "[+] ================================"
  89. echo "[+] 重启远程服务: ${REMOTE}"
  90. echo "[+] MySQL: ${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}"
  91. echo "[+] Redis: ${REDIS_HOST}:${REDIS_PORT} db=${REDIS_DATABASE}"
  92. echo "[+] ================================"
  93. ssh "$REMOTE" << EEOOFF
  94. set -e
  95. echo "[remote] 停止旧容器..."
  96. docker rm -f ${MODULE} || true
  97. echo "[remote] 拉取新镜像..."
  98. docker pull ${IMAGE_TAG}
  99. echo "[remote] 初始化挂载目录..."
  100. mkdir -p /logs/${MODULE}
  101. chown 1000:1000 /logs/${MODULE}
  102. echo "[remote] 启动新容器..."
  103. docker run -d \
  104. --name ${MODULE} \
  105. --restart always \
  106. ${MEMORY_LIMIT} \
  107. -p 9901:9901 \
  108. -p 9902:8090 \
  109. --volume /etc/localtime:/etc/localtime \
  110. -v /var/run/docker.sock:/var/run/docker.sock \
  111. --group-add \$(stat -c '%g' /var/run/docker.sock) \
  112. -v /logs/${MODULE}:/app/logs \
  113. -v /data/www/file/:/data/www/file/ \
  114. -e ACTIVE_ENV=${ENV} \
  115. -e MYSQL_HOST=${MYSQL_HOST} \
  116. -e MYSQL_PROT=${MYSQL_PORT} \
  117. -e MYSQL_DATABASE=${MYSQL_DATABASE} \
  118. -e MYSQL_USERNAME=${MYSQL_USERNAME} \
  119. -e MYSQL_PASSWORD='${MYSQL_PASSWORD}' \
  120. -e REDIS_HOST=${REDIS_HOST} \
  121. -e REDIS_PORT=${REDIS_PORT} \
  122. -e REDIS_PASSWORD='${REDIS_PASSWORD}' \
  123. -e REDIS_DATABASE=${REDIS_DATABASE} \
  124. -e ACTIVE_ENV=${ENV} \
  125. --privileged=true \
  126. ${IMAGE_TAG}
  127. echo "[remote] 容器已启动"
  128. docker ps --filter "name=${MODULE}" --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"
  129. EEOOFF
  130. echo "[+] 远程部署完成"
  131. echo "[+] ================================"
  132. }
  133. # ========== 解析参数 ==========
  134. while getopts "e:v:h" arg; do
  135. case $arg in
  136. e)
  137. ENV=$OPTARG
  138. echo "[+] 部署环境: $ENV"
  139. ;;
  140. v)
  141. VERSION=$OPTARG
  142. echo "[+] 镜像版本: $VERSION"
  143. ;;
  144. h)
  145. usage
  146. exit 0
  147. ;;
  148. *)
  149. usage
  150. exit 1
  151. ;;
  152. esac
  153. done
  154. # ========== 执行 ==========
  155. docker_login
  156. build_image
  157. restart_app