#!/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