QSSS_new / Dockerfile
misonL's picture
feat(Dockerfile): 重构Dockerfile以支持前后端构建,优化依赖安装和环境配置
fbb4d1b
Raw
History Blame Contribute Delete
3.66 kB
# 阶段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}"]