#!/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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" 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}" echo "==> 构建前端镜像: ${WEB_IMAGE} (${PLATFORM})" echo " 基础镜像: ${NODE_IMAGE} / ${NGINX_IMAGE}" docker build "${BUILD_ARGS[@]}" \ --build-arg "NODE_IMAGE=${NODE_IMAGE}" \ --build-arg "NGINX_IMAGE=${NGINX_IMAGE}" \ --build-arg "NPM_REGISTRY=${NPM_REGISTRY}" \ -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