# 多阶段构建 - 前端构建阶段 FROM node:18-alpine AS frontend-builder WORKDIR /app/frontend # 复制前端依赖文件 COPY frontend/package*.json ./ # 安装前端依赖(包括 devDependencies,因为需要 vite 构建) RUN npm ci # 复制前端源码 COPY frontend/ ./ # 构建前端(使用默认的 .env 文件中的配置) RUN npm run build # 后端运行阶段 FROM node:18-alpine WORKDIR /app # 安装 dumb-init 和 envsubst RUN apk add --no-cache dumb-init gettext # 复制后端依赖文件 COPY backend/package*.json ./ # 安装后端依赖(仅生产依赖) RUN npm ci --only=production # 复制后端源码 COPY backend/ ./ # 从前端构建阶段复制构建产物 COPY --from=frontend-builder /app/frontend/dist ./public # 创建上传目录 RUN mkdir -p uploads # 复制启动脚本 COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh # 暴露端口 EXPOSE 3000 # 设置环境变量 ENV NODE_ENV=production # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD node -e "require('http').get('http://localhost:3000/api/activities', (r) => process.exit(r.statusCode === 200 ? 0 : 1))" # 使用启动脚本 ENTRYPOINT ["docker-entrypoint.sh"] CMD ["node", "server.js"]