Dockerfile 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # Dockerfile for AIServ
  2. # 使用 Python 3.11(稳定兼容)
  3. FROM docker.m.daocloud.io/library/python:3.11-slim
  4. # 设置环境变量
  5. ENV PYTHONDONTWRITEBYTECODE=1 \
  6. PYTHONUNBUFFERED=1 \
  7. PIP_NO_CACHE_DIR=1 \
  8. PYTHONPATH=/app
  9. #添加项目根目录到Python路径
  10. WORKDIR /app
  11. # 1. 安装系统依赖
  12. # PyTorch和sentence-transformers需要编译工具
  13. RUN apt-get update && apt-get install -y \
  14. gcc \
  15. g++ \
  16. git \
  17. curl \
  18. && rm -rf /var/lib/apt/lists/*
  19. # 2. 复制依赖文件并安装
  20. COPY requirements.txt .
  21. # 分开安装以避免依赖冲突
  22. # 2.1 先安装PyTorch(指定CPU版本)
  23. RUN pip install --no-cache-dir \
  24. torch==2.8.0 \
  25. --index-url https://download.pytorch.org/whl/cpu
  26. # 2.2 安装NumPy
  27. RUN pip install --no-cache-dir numpy==2.2.6
  28. # 2.3 安装其他依赖
  29. RUN pip install --no-cache-dir \
  30. --index-url https://pypi.tuna.tsinghua.edu.cn/simple \
  31. --trusted-host pypi.tuna.tsinghua.edu.cn \
  32. flask==3.1.2 \
  33. flask-cors==6.0.1 \
  34. scikit-learn==1.7.2 \
  35. sentence-transformers==5.1.1 \
  36. joblib==1.5.2 \
  37. cachetools==6.2.1
  38. # 3. 验证关键包安装成功
  39. RUN python -c "import torch; print(f'✓ PyTorch {torch.__version__} installed')" && \
  40. python -c "import numpy; print(f'✓ NumPy {numpy.__version__} installed')" && \
  41. python -c "import flask; print(f'✓ Flask {flask.__version__} installed')" && \
  42. python -c "from sentence_transformers import SentenceTransformer; print('✓ sentence-transformers installed')"
  43. # 4. 复制应用代码
  44. # 注意:logs/目录不需要复制,运行时生成
  45. COPY app.py .
  46. COPY api/ ./api/
  47. COPY models/ ./models/
  48. COPY services/ ./services/
  49. COPY utils/ ./utils/
  50. # 5. 验证模型文件是否存在
  51. RUN if [ -d "models/bin/all-MiniLM-L6-v2" ]; then \
  52. echo "✓ Model files found: models/bin/all-MiniLM-L6-v2"; \
  53. ls -la models/bin/all-MiniLM-L6-v2/ | head -5; \
  54. else \
  55. echo "⚠ Warning: Model directory not found"; \
  56. fi
  57. # 6. 创建非root用户(安全最佳实践)
  58. RUN useradd -m -u 1000 appuser && \
  59. chown -R appuser:appuser /app
  60. USER appuser
  61. # 7. 创建日志目录(确保有写入权限)
  62. RUN mkdir -p /app/logs && chmod 755 /app/logs
  63. # 8. 暴露端口(Flask默认5000)
  64. EXPOSE 5000
  65. # 9. 健康检查(可选)
  66. HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  67. CMD python -c "import requests; requests.get('http://localhost:5000/health', timeout=5)" 2>/dev/null || exit 1
  68. # 10. 启动应用
  69. CMD ["python", "app.py"]