build.sh 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. docker run -d \
  101. --name ${MODULE} \
  102. --restart always \
  103. ${MEMORY_LIMIT} \
  104. -p 9901:9901 \
  105. -p 9902:8090 \
  106. --volume /etc/localtime:/etc/localtime \
  107. -v /logs/${MODULE}:/app/logs \
  108. -v /data/www/file/:/data/www/file/ \
  109. -e ACTIVE_ENV=${ENV} \
  110. -e MYSQL_HOST=${MYSQL_HOST} \
  111. -e MYSQL_PROT=${MYSQL_PORT} \
  112. -e MYSQL_DATABASE=${MYSQL_DATABASE} \
  113. -e MYSQL_USERNAME=${MYSQL_USERNAME} \
  114. -e MYSQL_PASSWORD='${MYSQL_PASSWORD}' \
  115. -e REDIS_HOST=${REDIS_HOST} \
  116. -e REDIS_PORT=${REDIS_PORT} \
  117. -e REDIS_PASSWORD='${REDIS_PASSWORD}' \
  118. -e REDIS_DATABASE=${REDIS_DATABASE} \
  119. -e ACTIVE_ENV=${ENV} \
  120. --privileged=true \
  121. ${IMAGE_TAG}
  122. echo "[remote] 容器已启动"
  123. docker ps --filter "name=${MODULE}" --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"
  124. EEOOFF
  125. echo "[+] 远程部署完成"
  126. echo "[+] ================================"
  127. }
  128. # ========== 解析参数 ==========
  129. while getopts "e:v:h" arg; do
  130. case $arg in
  131. e)
  132. ENV=$OPTARG
  133. echo "[+] 部署环境: $ENV"
  134. ;;
  135. v)
  136. VERSION=$OPTARG
  137. echo "[+] 镜像版本: $VERSION"
  138. ;;
  139. h)
  140. usage
  141. exit 0
  142. ;;
  143. *)
  144. usage
  145. exit 1
  146. ;;
  147. esac
  148. done
  149. # ========== 执行 ==========
  150. docker_login
  151. build_image
  152. restart_app