# 阶段1: Node镜像构建前端 (qsss-web) FROM node:20-alpine AS frontend_builder WORKDIR /app/qsss-web # 复制前端依赖文件并安装 COPY qsss-web/package.json qsss-web/pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile # 复制前端所有代码 COPY qsss-web/ . # 构建前端应用 RUN npm run build # 阶段2: Python镜像构建后端 FROM python:3.9-slim-bullseye AS backend_builder WORKDIR /app # 安装系统依赖 # 减少不必要的构建依赖,只保留TA-Lib编译所需 RUN echo "--- 开始安装系统依赖 ---" && \ apt-get update && apt-get install -y \ libssl-dev \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* && \ echo "--- 系统依赖安装完成 ---" # 安装TA-Lib # 优化TA-Lib安装,确保清理临时文件 RUN echo "--- 开始安装TA-Lib ---" && \ mkdir -p /ta-lib-build && \ wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O /ta-lib-build/ta-lib-0.4.0-src.tar.gz && \ tar -xzf /ta-lib-build/ta-lib-0.4.0-src.tar.gz -C /ta-lib-build && \ cd /ta-lib-build/ta-lib && \ ./configure --prefix=/usr && \ make && \ make install && \ rm -rf /ta-lib-build && \ echo "--- TA-Lib安装完成 ---" # 清理TA-Lib构建文件 RUN ldconfig # 将ldconfig放在单独的RUN层 RUN ln -s /usr/lib/libta_lib.so /usr/lib/libta-lib.so && \ ln -s /usr/lib/libta_lib.so.0 /usr/lib/libta-lib.so.0 # 添加TA-Lib兼容性符号链接 # 创建Python虚拟环境 ENV VIRTUAL_ENV=/app/backend_venv RUN echo "--- 开始创建Python虚拟环境 ---" && \ python -m venv $VIRTUAL_ENV && \ echo "--- Python虚拟环境创建完成 ---" ENV PATH="$VIRTUAL_ENV/bin:$PATH" # 复制后端依赖文件并安装 # 只复制backend/requirements.txt,因为已经合并了所有后端依赖 COPY backend/requirements.txt . RUN echo "--- 开始安装Python依赖 ---" && \ pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt && \ pip install --no-cache-dir fake-useragent==1.5.1 && \ # 清理pip缓存 rm -rf ~/.cache/pip && \ echo "--- Python依赖安装完成 ---" # 复制后端代码 COPY backend/ backend/ # 阶段3: 运行时镜像整合前后端 FROM debian:bullseye-slim AS final # 使用bullseye-slim作为最终镜像 # 安装Nginx和Supervisor RUN echo "--- 开始安装Nginx和CA证书 ---" && \ apt-get update && apt-get install -y \ nginx \ ca-certificates \ curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* && \ echo "--- Nginx和CA证书安装完成 ---" # 创建必要的目录 RUN echo "--- 开始创建必要目录 ---" && \ mkdir -p /app/qsss-web/out \ /app/backend \ /app/backend_venv \ /etc/nginx/sites-enabled \ /var/log/nginx && \ echo "--- 必要目录创建完成 ---" # 从前端构建阶段复制前端静态文件 COPY --from=frontend_builder /app/qsss-web/out /app/qsss-web/out # 从后端构建阶段复制Python虚拟环境 COPY --from=backend_builder /app/backend_venv /app/backend_venv # 从后端构建阶段复制后端代码 COPY --from=backend_builder /app/backend /app/backend # 复制Nginx配置 COPY nginx.conf /etc/nginx/sites-enabled/default # 复制Supervisor配置 # 移除Supervisor配置复制 # 设置环境变量 # 暴露端口 EXPOSE 7860 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl --fail http://localhost:7860/health || exit 1 # 启动命令 CMD ["bash", "-c", "nginx -g 'daemon off;' & cd /app/backend && /app/backend_venv/bin/uvicorn app.main:app --host 0.0.0.0 --port ${PORT}"]