77 lines
1.8 KiB
Docker
77 lines
1.8 KiB
Docker
# ===========================================
|
||
# 第一阶段:构建前端
|
||
# ===========================================
|
||
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"]
|