# 多阶段构建 - 基础镜像 FROM python:3.12-slim as base # 设置工作目录 WORKDIR /app # 设置环境变量 ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ TZ=Asia/Shanghai \ PYTHONPATH=/app # 安装系统依赖 # build-essential: 编译依赖 # curl: 网络工具 # libgl1: OpenCV 等库可能需要 # libglib2.0-0: GLib 库 RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ curl \ libgl1 \ libglib2.0-0 \ && rm -rf /var/lib/apt/lists/* # 复制依赖文件 COPY requirements.txt . # 处理 Windows 特有依赖 (pywin32) 并安装依赖 RUN sed -i '/pywin32/d' requirements.txt && \ pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir -r requirements.txt # 开发环境镜像 FROM base as development # 安装开发依赖 RUN pip install --no-cache-dir \ pytest \ pytest-asyncio \ pytest-cov \ hypothesis \ httpx \ black \ flake8 \ isort \ mypy # 复制项目代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令(开发模式,带热重载) CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] # 生产环境镜像 FROM base as production # 创建非 root 用户 RUN useradd -m -u 1000 appuser && \ chown -R appuser:appuser /app # 复制项目代码 COPY --chown=appuser:appuser . . # 切换到非 root 用户 USER appuser # 暴露端口 EXPOSE 8000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 # 启动命令(生产模式,多 worker) CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]