build-docker-images.sh 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/env bash
  2. # 在己方环境构建应用镜像(不向甲方交付源码)
  3. set -euo pipefail
  4. ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
  5. cd "$ROOT"
  6. if ! docker info >/dev/null 2>&1; then
  7. echo "错误: 无法连接 Docker 守护进程。" >&2
  8. echo " macOS: 请先打开 Docker Desktop,等待菜单栏鲸鱼图标就绪后再执行。" >&2
  9. echo " Linux: sudo systemctl start docker" >&2
  10. exit 1
  11. fi
  12. export DOCKER_BUILDKIT=1
  13. VERSION="${1:-latest}"
  14. PLATFORM="${DOCKER_PLATFORM:-linux/amd64}"
  15. BACKEND_IMAGE="zkxw-backend:${VERSION}"
  16. WEB_IMAGE="zkxw-web:${VERSION}"
  17. PIP_INDEX_URL="${PIP_INDEX_URL:-https://mirrors.aliyun.com/pypi/simple/}"
  18. PIP_TRUSTED_HOST="${PIP_TRUSTED_HOST:-mirrors.aliyun.com}"
  19. NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmmirror.com}"
  20. BUILD_ARGS=(
  21. --progress=plain
  22. --platform "${PLATFORM}"
  23. )
  24. if [[ "$(uname -s)" == "Darwin" && "$(uname -m)" == "arm64" && "${PLATFORM}" == "linux/amd64" ]]; then
  25. echo ""
  26. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  27. echo " 提示: 当前为 Apple Silicon 交叉构建 linux/amd64"
  28. echo " 后端 pip 约 15~40 分钟、前端 pnpm 约 10~20 分钟"
  29. echo " 日志可能长时间停在某一步,请勿 Ctrl+C,除非确认已失败"
  30. echo " 更快方式: 在 Linux x86 云主机上执行同一打包脚本"
  31. echo " 前端 vite build 建议 Docker Desktop 内存 ≥ 4GB"
  32. echo " (Settings → Resources → Memory;仍 OOM 可加大 NODE_MAX_OLD_SPACE_SIZE)"
  33. echo " pnpm install 出现 ETIMEDOUT 时会自动重试,336/340 后仍可能再等数分钟"
  34. echo " 请勿 Ctrl+C;更快方式见 deploy/docker/README.md §11 发版方打包"
  35. echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
  36. echo ""
  37. fi
  38. echo "==> 构建后端镜像: ${BACKEND_IMAGE} (${PLATFORM})"
  39. docker build "${BUILD_ARGS[@]}" \
  40. --build-arg "PIP_INDEX_URL=${PIP_INDEX_URL}" \
  41. --build-arg "PIP_TRUSTED_HOST=${PIP_TRUSTED_HOST}" \
  42. -t "${BACKEND_IMAGE}" -f backend/Dockerfile backend/
  43. NODE_IMAGE="${NODE_IMAGE:-docker.m.daocloud.io/library/node:20-alpine}"
  44. NGINX_IMAGE="${NGINX_IMAGE:-docker.m.daocloud.io/library/nginx:1.27-alpine}"
  45. NODE_MAX_OLD_SPACE_SIZE="${NODE_MAX_OLD_SPACE_SIZE:-4096}"
  46. echo "==> 构建前端镜像: ${WEB_IMAGE} (${PLATFORM})"
  47. echo " 基础镜像: ${NODE_IMAGE} / ${NGINX_IMAGE}"
  48. echo " npm/pnpm 镜像: ${NPM_REGISTRY}"
  49. echo " Node 堆上限: ${NODE_MAX_OLD_SPACE_SIZE}MB"
  50. if [[ "${NPM_REGISTRY}" == *"registry.npmjs.org"* ]]; then
  51. echo " 警告: 国内网络访问 registry.npmjs.org 常 ETIMEDOUT,建议去掉 NPM_REGISTRY 用默认 npmmirror"
  52. fi
  53. docker build "${BUILD_ARGS[@]}" \
  54. --build-arg "NODE_IMAGE=${NODE_IMAGE}" \
  55. --build-arg "NGINX_IMAGE=${NGINX_IMAGE}" \
  56. --build-arg "NPM_REGISTRY=${NPM_REGISTRY}" \
  57. --build-arg "NODE_MAX_OLD_SPACE_SIZE=${NODE_MAX_OLD_SPACE_SIZE}" \
  58. -t "${WEB_IMAGE}" -f deploy/docker/web-admin/Dockerfile .
  59. if [[ "${VERSION}" != "latest" ]]; then
  60. docker tag "${BACKEND_IMAGE}" zkxw-backend:latest
  61. docker tag "${WEB_IMAGE}" zkxw-web:latest
  62. echo "==> 已同步标签 zkxw-backend:latest / zkxw-web:latest"
  63. fi
  64. echo ""
  65. echo "完成。镜像:"
  66. docker images --format ' {{.Repository}}:{{.Tag}}\t{{.Size}}' | grep -E '^ zkxw-(backend|web):' || true