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