# 多阶段构建 - 构建阶段 FROM node:20-alpine AS builder # 接受构建参数 ARG BUILD_MODE=production WORKDIR /app # 复制包管理文件 COPY package.json pnpm-lock.yaml ./ # 安装 pnpm 和依赖 RUN npm install -g pnpm && pnpm install # 复制源代码 COPY . . # 根据构建模式复制对应的环境文件 RUN if [ "$BUILD_MODE" = "flask" ]; then \ cp .env.flask .env; \ else \ cp .env.production .env; \ fi # 根据构建模式执行对应的构建命令 RUN if [ "$BUILD_MODE" = "flask" ]; then \ pnpm build:flask; \ else \ pnpm build; \ fi # 生产阶段 - nginx FROM nginx:alpine AS production # 接受端口参数,默认为5173 ARG PORT=5173 # 复制自定义 nginx 配置 RUN cat > /etc/nginx/conf.d/default.conf << EOF server { listen ${PORT}; server_name localhost; root /usr/share/nginx/html; index index.html; # 处理 SPA 路由 location / { try_files \$uri \$uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } # 安全头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; # Gzip 压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; } EOF # 从构建阶段复制构建产物 COPY --from=builder /app/dist /usr/share/nginx/html # 暴露端口(使用构建时指定的端口) EXPOSE ${PORT} # 启动 nginx CMD ["nginx", "-g", "daemon off;"]