# =========================================== # 第一阶段:构建前端 # =========================================== FROM node:20-alpine AS frontend-builder WORKDIR /app/frontend # 安装pnpm RUN npm install -g pnpm # 复制前端依赖文件 COPY frontend/package.json frontend/pnpm-lock.yaml ./ # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源代码并构建 COPY frontend/ . RUN pnpm build # =========================================== # 第二阶段:构建后端 # =========================================== FROM python:3.11-slim AS backend-builder WORKDIR /app # 安装系统依赖 RUN apt-get update && apt-get install -y \ gcc \ && rm -rf /var/lib/apt/lists/* # 复制并安装Python依赖 COPY backend/requirements.txt . RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir -r requirements.txt # =========================================== # 第三阶段:最终镜像 # =========================================== FROM python:3.11-slim # 安装nginx和必要的系统工具 RUN apt-get update && apt-get install -y \ nginx \ bash \ curl \ && rm -rf /var/lib/apt/lists/* # 创建应用目录 WORKDIR /app # 从backend-builder复制Python依赖(只复制site-packages,不要复制二进制文件) COPY --from=backend-builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages # 复制后端代码 COPY backend/ /app/ # 复制前端构建产物到nginx目录 COPY --from=frontend-builder /app/frontend/dist /usr/share/nginx/html # 复制nginx配置 COPY nginx.conf /etc/nginx/nginx.conf # 复制启动脚本 COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh # 创建必要的目录 RUN mkdir -p /var/cache/nginx /var/log/nginx /etc/nginx/conf.d /app/logs # 暴露端口 EXPOSE 80 # 设置入口点 ENTRYPOINT ["/app/entrypoint.sh"]