47 lines
1.9 KiB
Docker
47 lines
1.9 KiB
Docker
# ============================================================
|
||
# 青叶 —— 生产环境前端镜像(多阶段构建)
|
||
# Stage 1: Node 构建 Vite 生产包
|
||
# Stage 2: Nginx 提供静态文件 + SPA 路由回退
|
||
# ------------------------------------------------------------
|
||
# 构建「域名无关」:不设置任何 VITE_* 变量。前端代码在没有 VITE_API_BASE_URL /
|
||
# VITE_WS_BASE_URL 时,会自动使用页面同源地址(API 走相对路径 /api/v1,
|
||
# WebSocket 走 wss://<当前域名>)。因此同一份镜像可部署到任意域名。
|
||
# ============================================================
|
||
|
||
# ===== Stage 1: 构建 =====
|
||
FROM node:20-alpine AS builder
|
||
|
||
WORKDIR /app
|
||
|
||
# 复制依赖描述(package-lock.json 可选 —— 仓库未提交锁文件,用 npm install)
|
||
COPY package.json package-lock.json* ./
|
||
|
||
# 安装依赖(使用 npm 官方源)
|
||
RUN npm install
|
||
|
||
# 复制源码(frontend/.dockerignore 已排除 node_modules / dist / .env 等)
|
||
COPY . .
|
||
|
||
# Vite 打包(含 echarts / vue-echarts / naive-ui 等大依赖)较吃内存。
|
||
# 显式调高 V8 堆上限,避免在内存受限的 VPS 上报 "JavaScript heap out of memory"。
|
||
# 此值只是「允许上限」,V8 仅按需占用;若 VPS 物理内存很小,仍需加 swap(见 DEPLOYMENT.md)。
|
||
ENV NODE_OPTIONS="--max-old-space-size=2048"
|
||
|
||
# 直接调用 vite build,跳过 vue-tsc 类型检查
|
||
# (避免仓库中既有的类型错误阻断生产部署;类型检查请在 CI / 发布前单独执行)
|
||
# 如需严格的类型门禁,可改为 `npm run build`。
|
||
RUN npx vite build
|
||
|
||
# ===== Stage 2: 运行(Nginx 静态服务) =====
|
||
FROM nginx:alpine
|
||
|
||
# 复制构建产物
|
||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||
|
||
# 复制 SPA 专用 Nginx 配置(createWebHistory 需要 try_files 回退)
|
||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||
|
||
EXPOSE 80
|
||
|
||
CMD ["nginx", "-g", "daemon off;"]
|