# syntax=docker/dockerfile:1 # 华门窗云平台镜像(多阶段:前端构建 → Python 运行时) # 云端构建: git 仓库直接构建即可; 本地: docker build -t menchuang . # ---------- 阶段 1: 前端构建 (Vue3 + Vite → dist) ---------- FROM node:22-alpine AS web WORKDIR /web COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # ---------- 阶段 2: 后端运行时 (Python 3.14 + uv) ---------- FROM python:3.14-slim-bookworm # uv 包管理器(按 uv.lock 冻结安装) COPY --from=ghcr.io/astral-sh/uv:0.9 /uv /usr/local/bin/uv ENV UV_COMPILE_BYTECODE=1 \ UV_LINK_MODE=copy \ TZ=Asia/Shanghai WORKDIR /app # 依赖层(独立缓存: 代码变更不触发依赖重装) COPY pyproject.toml uv.lock README.md ./ RUN uv sync --frozen --no-dev --no-install-project # 应用代码 + 样板数据资产 + 前端产物 COPY src/ ./src/ COPY data/ ./data/ COPY --from=web /web/dist/ ./frontend/dist/ RUN uv sync --frozen --no-dev # 运行配置: SQLite 落在数据卷 /app/db (compose 挂载持久化) ENV HMC_DATABASE_URL="sqlite+aiosqlite:////app/db/huamenchuang.db" VOLUME ["/app/db"] COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \ CMD python -c "import urllib.request;urllib.request.urlopen('http://127.0.0.1:8000/api/health',timeout=4)" || exit 1 ENTRYPOINT ["entrypoint.sh"] CMD ["/app/.venv/bin/uvicorn", "huamenchuang.main:app", "--host", "0.0.0.0", "--port", "8000"]