Dockerfile 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # 基础镜像走 DaoCloud(避免 docker.1ms.run 等加速站缺 node/nginx manifest)
  2. ARG NODE_IMAGE=docker.m.daocloud.io/library/node:20-alpine
  3. ARG NGINX_IMAGE=docker.m.daocloud.io/library/nginx:1.27-alpine
  4. # ---------- OA H5(mobile-oa-h5 → /oa-h5/)----------
  5. FROM ${NODE_IMAGE} AS oa-h5-builder
  6. ARG NPM_REGISTRY=https://registry.npmmirror.com
  7. ARG NODE_MAX_OLD_SPACE_SIZE=4096
  8. ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}"
  9. ENV HUSKY=0
  10. RUN npm config set registry "${NPM_REGISTRY}" \
  11. && npm config set fetch-retries 5 \
  12. && npm config set fetch-retry-mintimeout 60000 \
  13. && npm config set fetch-retry-maxtimeout 600000 \
  14. && npm config set fetch-timeout 600000
  15. WORKDIR /oa-h5
  16. COPY mobile-oa-h5/package.json mobile-oa-h5/package-lock.json ./
  17. RUN --mount=type=cache,id=zkxw-oa-h5-npm,target=/root/.npm \
  18. npm ci --no-audit --no-fund
  19. COPY mobile-oa-h5/ .
  20. # 同域 /api、/minio/zkxw + 生产服务号 AppID(见 .env.docker)
  21. RUN npm run build -- --mode docker
  22. # ---------- Web Admin ----------
  23. FROM ${NODE_IMAGE} AS builder
  24. ARG NPM_REGISTRY=https://registry.npmmirror.com
  25. ARG PNPM_VERSION=9.15.4
  26. ARG NODE_MAX_OLD_SPACE_SIZE=4096
  27. ENV NODE_OPTIONS="--max-old-space-size=${NODE_MAX_OLD_SPACE_SIZE}"
  28. # 构建阶段须安装 devDependencies(vite 等);勿设 NODE_ENV=production
  29. ENV HUSKY=0
  30. # 国内机器勿用 registry.npmjs.org;先走镜像元数据,失败再直装 tarball
  31. RUN set -eux; \
  32. npm config set registry "${NPM_REGISTRY}"; \
  33. npm config set fetch-retries 5; \
  34. npm config set fetch-retry-mintimeout 60000; \
  35. npm config set fetch-retry-maxtimeout 600000; \
  36. npm config set fetch-timeout 600000; \
  37. if ! npm install -g "pnpm@${PNPM_VERSION}"; then \
  38. echo "npm 元数据安装 pnpm 失败,尝试 tarball: ${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \
  39. npm install -g "${NPM_REGISTRY}/pnpm/-/pnpm-${PNPM_VERSION}.tgz"; \
  40. fi; \
  41. pnpm --version
  42. WORKDIR /app
  43. COPY web-admin/package.json web-admin/pnpm-lock.yaml ./
  44. # BuildKit 缓存 pnpm store;提高 fetch 重试与超时,缓解 npmmirror ETIMEDOUT
  45. RUN --mount=type=cache,id=zkxw-pnpm-store,target=/root/.local/share/pnpm/store \
  46. pnpm config set registry "${NPM_REGISTRY}" \
  47. && pnpm config set fetch-retries 5 \
  48. && pnpm config set fetch-retry-mintimeout 60000 \
  49. && pnpm config set fetch-retry-maxtimeout 600000 \
  50. && pnpm config set network-timeout 600000 \
  51. && pnpm install --frozen-lockfile
  52. COPY web-admin/ .
  53. # docker 模式:esbuild 压缩 + 关闭 devtools/预压缩,降低构建内存(见 vite.config.ts)
  54. RUN pnpm exec vite build --mode docker
  55. FROM ${NGINX_IMAGE}
  56. COPY deploy/docker/nginx/default.conf /etc/nginx/conf.d/default.conf
  57. COPY --from=builder /app/dist /usr/share/nginx/html
  58. COPY --from=oa-h5-builder /oa-h5/dist /usr/share/nginx/html/oa-h5
  59. EXPOSE 80
  60. HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  61. CMD wget -qO- http://127.0.0.1/ || exit 1