# 基础镜像走 DaoCloud(避免 docker.1ms.run 等加速站缺 node/nginx manifest) ARG NODE_IMAGE=docker.m.daocloud.io/library/node:20-alpine ARG NGINX_IMAGE=docker.m.daocloud.io/library/nginx:1.27-alpine # ---------- OA H5(mobile-oa-h5 → /oa-h5/)---------- FROM ${NODE_IMAGE} AS oa-h5-builder ARG NPM_REGISTRY=https://registry.npmmirror.com ARG NODE_MAX_OLD_SPACE_SIZE=4096 ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" ENV HUSKY=0 RUN npm config set registry "${NPM_REGISTRY}" \ && npm config set fetch-retries 5 \ && npm config set fetch-retry-mintimeout 60000 \ && npm config set fetch-retry-maxtimeout 600000 \ && npm config set fetch-timeout 600000 WORKDIR /oa-h5 COPY mobile-oa-h5/package.json mobile-oa-h5/package-lock.json ./ RUN --mount=type=cache,id=zkxw-oa-h5-npm,target=/root/.npm \ npm ci --no-audit --no-fund COPY mobile-oa-h5/ . # 同域 /api、/minio/zkxw + 生产服务号 AppID(见 .env.docker) RUN npm run build -- --mode docker # ---------- Web Admin ---------- FROM ${NODE_IMAGE} AS builder ARG NPM_REGISTRY=https://registry.npmmirror.com ARG PNPM_VERSION=9.15.4 ARG NODE_MAX_OLD_SPACE_SIZE=4096 ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}" # 构建阶段须安装 devDependencies(vite 等);勿设 NODE_ENV=production ENV HUSKY=0 # 国内机器勿用 registry.npmjs.org;先走镜像元数据,失败再直装 tarball RUN set -eux; \ npm config set registry "${NPM_REGISTRY}"; \ npm config set fetch-retries 5; \ npm config set fetch-retry-mintimeout 60000; \ npm config set fetch-retry-maxtimeout 600000; \ npm config set fetch-timeout 600000; \ if ! npm install -g "pnpm@${PNPM_VERSION}"; then \ echo "npm 元数据安装 pnpm 失败,尝试 tarball: ${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \ npm install -g "${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \ fi; \ pnpm --version WORKDIR /app COPY web-admin/package.json web-admin/pnpm-lock.yaml ./ # BuildKit 缓存 pnpm store;提高 fetch 重试与超时,缓解 npmmirror ETIMEDOUT RUN --mount=type=cache,id=zkxw-pnpm-store,target=/root/.local/share/pnpm/store \ pnpm config set registry "${NPM_REGISTRY}" \ && pnpm config set fetch-retries 5 \ && pnpm config set fetch-retry-mintimeout 60000 \ && pnpm config set fetch-retry-maxtimeout 600000 \ && pnpm config set network-timeout 600000 \ && pnpm install --frozen-lockfile COPY web-admin/ . # docker 模式:esbuild 压缩 + 关闭 devtools/预压缩,降低构建内存(见 vite.config.ts) RUN pnpm exec vite build --mode docker FROM ${NGINX_IMAGE} COPY deploy/docker/nginx/default.conf /etc/nginx/conf.d/default.conf COPY --from=builder /app/dist /usr/share/nginx/html COPY --from=oa-h5-builder /oa-h5/dist /usr/share/nginx/html/oa-h5 EXPOSE 80 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -qO- http://127.0.0.1/ || exit 1