Dockerfile 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # 多阶段构建 - 基础镜像
  2. FROM python:3.12-slim as base
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 设置环境变量
  6. ENV PYTHONDONTWRITEBYTECODE=1 \
  7. PYTHONUNBUFFERED=1 \
  8. TZ=Asia/Shanghai \
  9. PYTHONPATH=/app
  10. # 安装系统依赖
  11. # build-essential: 编译依赖
  12. # curl: 网络工具
  13. # libgl1: OpenCV 等库可能需要
  14. # libglib2.0-0: GLib 库
  15. RUN apt-get update && apt-get install -y --no-install-recommends \
  16. build-essential \
  17. curl \
  18. libgl1 \
  19. libglib2.0-0 \
  20. && rm -rf /var/lib/apt/lists/*
  21. # 复制依赖文件
  22. COPY requirements.txt .
  23. # 处理 Windows 特有依赖 (pywin32) 并安装依赖
  24. RUN sed -i '/pywin32/d' requirements.txt && \
  25. pip install --no-cache-dir --upgrade pip && \
  26. pip install --no-cache-dir -r requirements.txt
  27. # 开发环境镜像
  28. FROM base as development
  29. # 安装开发依赖
  30. RUN pip install --no-cache-dir \
  31. pytest \
  32. pytest-asyncio \
  33. pytest-cov \
  34. hypothesis \
  35. httpx \
  36. black \
  37. flake8 \
  38. isort \
  39. mypy
  40. # 复制项目代码
  41. COPY . .
  42. # 暴露端口
  43. EXPOSE 8000
  44. # 启动命令(开发模式,带热重载)
  45. CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
  46. # 生产环境镜像
  47. FROM base as production
  48. # 创建非 root 用户
  49. RUN useradd -m -u 1000 appuser && \
  50. chown -R appuser:appuser /app
  51. # 复制项目代码
  52. COPY --chown=appuser:appuser . .
  53. # 切换到非 root 用户
  54. USER appuser
  55. # 暴露端口
  56. EXPOSE 8000
  57. # 健康检查
  58. HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  59. CMD curl -f http://localhost:8000/health || exit 1
  60. # 启动命令(生产模式,多 worker)
  61. CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]