# ---------- 第一阶段:构建 ---------- FROM node:20-alpine AS build WORKDIR /app # 构建阶段必须是开发环境,否则 npm 会跳过 devDependencies(tsc/vite 缺失 → 127) ENV NODE_ENV=development # 先只拷贝依赖清单,利用 Docker 层缓存加速重复构建 COPY package.json package-lock.json* ./ # 国内网络环境可取消下一行注释使用镜像源 # RUN npm config set registry https://registry.npmmirror.com RUN npm ci --include=dev # 兜底:某些环境的 npm 配置会强制跳过 devDependencies(导致 tsc 缺失、127 报错) # 显式按 package.json 声明逐个安装,explicit install 不受 omit 配置影响 RUN npm install --no-save --force $(node -e "console.log(Object.keys(require('./package.json').devDependencies||{}).join(' '))") # 依赖自检:如果 tsc/vite 没装上,在这里就明确失败而不是 127 RUN ./node_modules/.bin/tsc --version && ./node_modules/.bin/vite --version # 拷贝源码并构建(产物输出到 /app/dist) COPY . . RUN npm run build # ---------- 第二阶段:运行 ---------- FROM nginx:1.27-alpine # 单页应用 Nginx 配置(SPA 回退 + 静态资源缓存) COPY nginx.conf /etc/nginx/conf.d/default.conf # 拷贝构建产物 COPY --from=build /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]