Dockerfile 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. # Dockerfile for AIServ
  2. # 使用 Python 3.11(稳定兼容)
  3. FROM 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. flask==3.1.2 \
  31. flask-cors==6.0.1 \
  32. scikit-learn==1.7.2 \
  33. sentence-transformers==5.1.1 \
  34. joblib==1.5.2 \
  35. cachetools==6.2.1
  36. # 3. 验证关键包安装成功
  37. RUN python -c "import torch; print(f'✓ PyTorch {torch.__version__} installed')" && \
  38. python -c "import numpy; print(f'✓ NumPy {numpy.__version__} installed')" && \
  39. python -c "import flask; print(f'✓ Flask {flask.__version__} installed')" && \
  40. python -c "from sentence_transformers import SentenceTransformer; print('✓ sentence-transformers installed')"
  41. # 4. 复制应用代码
  42. # 注意:logs/目录不需要复制,运行时生成
  43. COPY app.py .
  44. COPY api/ ./api/
  45. COPY models/ ./models/
  46. COPY services/ ./services/
  47. COPY utils/ ./utils/
  48. # 5. 验证模型文件是否存在
  49. RUN if [ -d "models/bin/all-MiniLM-L6-v2" ]; then \
  50. echo "✓ Model files found: models/bin/all-MiniLM-L6-v2"; \
  51. ls -la models/bin/all-MiniLM-L6-v2/ | head -5; \
  52. else \
  53. echo "⚠ Warning: Model directory not found"; \
  54. fi
  55. # 6. 创建非root用户(安全最佳实践)
  56. RUN useradd -m -u 1000 appuser && \
  57. chown -R appuser:appuser /app
  58. USER appuser
  59. # 7. 创建日志目录(确保有写入权限)
  60. RUN mkdir -p /app/logs && chmod 755 /app/logs
  61. # 8. 暴露端口(Flask默认5000)
  62. EXPOSE 5000
  63. # 9. 健康检查(可选)
  64. HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
  65. CMD python -c "import requests; requests.get('http://localhost:5000/health', timeout=5)" 2>/dev/null || exit 1
  66. # 10. 启动应用
  67. CMD ["python", "app.py"]