diff --git a/Dockerfile b/Dockerfile index ef44df7..939ae51 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,20 @@ -FROM node:20-alpine AS base +# 默认使用本地镜像 local-node:20-alpine(可先执行: docker tag node:20-alpine local-node:20-alpine) +# 也可通过 --build-arg NODE_IMAGE=xxx 指定其他镜像 +ARG NODE_IMAGE=node:20-alpine +FROM ${NODE_IMAGE} AS base FROM base AS deps +# 国内构建若卡在 npm ci,可传 --build-arg NPM_REGISTRY=https://registry.npmmirror.com +ARG NPM_REGISTRY=https://registry.npmjs.org/ RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json package-lock.json ./ -# 提高超时与重试,避免内网/跨平台构建时 npm 拉包 EIDLETIMEOUT -RUN npm config set fetch-timeout 300000 && npm config set fetch-retries 5 && npm ci +RUN npm config set registry "$NPM_REGISTRY" \ + && npm config set fetch-timeout 300000 \ + && npm config set fetch-retries 5 +# 使用 BuildKit 缓存 npm 目录,二次构建更快 +RUN --mount=type=cache,target=/root/.npm \ + npm ci # Rebuild the source code only when needed FROM base AS builder diff --git a/build-and-push.sh b/build-and-push.sh index d917278..699aa7a 100755 --- a/build-and-push.sh +++ b/build-and-push.sh @@ -108,11 +108,19 @@ build_image() { log_info "当前架构: $CURRENT_ARCH" log_info "目标平台: $PLATFORM (服务器x86架构)" - # 构建x86架构镜像 + # 构建x86架构镜像(可用 NODE_IMAGE 或 --node-image 指定本地 Node 基础镜像) local build_opts=() if [ "$NO_CACHE" = true ]; then build_opts+=(--no-cache) fi + if [ -n "$NODE_IMAGE" ]; then + log_info "使用 Node 基础镜像: $NODE_IMAGE" + build_opts+=(--build-arg "NODE_IMAGE=$NODE_IMAGE") + fi + if [ -n "$NPM_REGISTRY" ]; then + log_info "使用 npm 源: $NPM_REGISTRY" + build_opts+=(--build-arg "NPM_REGISTRY=$NPM_REGISTRY") + fi if docker build \ "${build_opts[@]}" \ @@ -217,6 +225,22 @@ parse_args() { VERSION_ARG="$2" shift 2 ;; + --node-image) + if [ -z "$2" ]; then + log_error "--node-image 参数需要指定镜像名(如 node:20-alpine)" + exit 1 + fi + NODE_IMAGE="$2" + shift 2 + ;; + --npm-registry) + if [ -z "$2" ]; then + log_error "--npm-registry 参数需要指定地址(如 https://registry.npmmirror.com)" + exit 1 + fi + NPM_REGISTRY="$2" + shift 2 + ;; --build-only) BUILD_ONLY=true shift @@ -290,6 +314,8 @@ show_help() { echo "" echo "选项:" echo " -v, --version <版本号> 指定要构建的版本号" + echo " --node-image <镜像> 指定 Node 基础镜像(默认 node:20-alpine),可用本地镜像" + echo " --npm-registry <地址> 指定 npm 源(卡在 npm ci 时可用 https://registry.npmmirror.com)" echo " --build-only 仅构建镜像,不推送" echo " --no-cache 不使用缓存构建(暂未实现)" echo " -h, --help 显示此帮助信息" @@ -304,6 +330,10 @@ show_help() { echo " $0 --version 1.0.4 # 使用 --version 参数指定版本1.0.4" echo " $0 --build-only # 仅构建,不推送" echo " $0 -v 1.0.4 --build-only # 指定版本并仅构建" + echo " $0 --node-image node:20-alpine # 使用本地/指定 Node 镜像" + echo " $0 --npm-registry https://registry.npmmirror.com # 国内构建用镜像源" + echo " NODE_IMAGE=node:20-alpine $0 # 通过环境变量指定 Node 镜像" + echo " NPM_REGISTRY=https://registry.npmmirror.com $0 # 通过环境变量指定 npm 源" echo "" echo "环境要求:" echo " - Docker已安装并运行" diff --git a/public/favicon.ico b/public/favicon.ico index 12d4a9e..cf106ac 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ