# ---------- 阶段1:前端编译(Node打包静态产物) ---------- FROM node:22-alpine AS frontend-builder WORKDIR /frontend # 复制前端依赖,利用Docker缓存优化 COPY frontend/package*.json ./ RUN npm install --registry=https://registry.npmmirror.com # 复制前端代码,编译出静态产物 COPY frontend/ . RUN npm run build # ---------- 阶段2:后端依赖构建(uv构建虚拟环境) ---------- FROM python:3.11-slim AS backend-builder WORKDIR /backend # 安装uv,同步Python依赖 COPY backend/pyproject.toml backend/uv.lock ./ RUN --mount=type=cache,target=/root/.cache/uv \ pip install --no-cache-dir uv && \ uv sync --frozen --no-dev --index https://pypi.tuna.tsinghua.edu.cn/simple/ # 复制后端代码 COPY backend/app ./app COPY backend/main.py ./ # ---------- 阶段3:最终运行镜像(仅Python+Uvicorn,托管前端静态) ---------- FROM python:3.11-slim WORKDIR /app # 复制构建好的后端虚拟环境 COPY --from=backend-builder /backend/.venv /app/.venv COPY --from=backend-builder /backend/app /app/app COPY --from=backend-builder /backend/main.py /app/main.py # 复制前端编译好的静态产物,放到后端能访问的目录 # 这里我们把静态文件放到 /app/static 目录 COPY --from=frontend-builder /frontend/dist /app/app/static # 把venv加入PATH ENV PATH="/app/.venv/bin:$PATH" # 暴露Uvicorn端口 EXPOSE 8000 # 直接启动Uvicorn,由Uvicorn配合后端框架托管静态文件 CMD ["python3", "main.py"]