Files
zkxw/scripts/build-docker-images.sh
T
2026-06-30 11:20:36 +08:00

80 lines
3.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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