# Dockerfile for AIServ # 使用 Python 3.11(稳定兼容) FROM python:3.11-slim # 设置环境变量 ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PYTHONPATH=/app #添加项目根目录到Python路径 WORKDIR /app # 1. 安装系统依赖 # PyTorch和sentence-transformers需要编译工具 RUN apt-get update && apt-get install -y \ gcc \ g++ \ git \ curl \ && rm -rf /var/lib/apt/lists/* # 2. 复制依赖文件并安装 COPY requirements.txt . # 分开安装以避免依赖冲突 # 2.1 先安装PyTorch(指定CPU版本) RUN pip install --no-cache-dir \ torch==2.8.0 \ --index-url https://download.pytorch.org/whl/cpu # 2.2 安装NumPy RUN pip install --no-cache-dir numpy==2.2.6 # 2.3 安装其他依赖 RUN pip install --no-cache-dir \ flask==3.1.2 \ flask-cors==6.0.1 \ scikit-learn==1.7.2 \ sentence-transformers==5.1.1 \ joblib==1.5.2 \ cachetools==6.2.1 # 3. 验证关键包安装成功 RUN python -c "import torch; print(f'✓ PyTorch {torch.__version__} installed')" && \ python -c "import numpy; print(f'✓ NumPy {numpy.__version__} installed')" && \ python -c "import flask; print(f'✓ Flask {flask.__version__} installed')" && \ python -c "from sentence_transformers import SentenceTransformer; print('✓ sentence-transformers installed')" # 4. 复制应用代码 # 注意:logs/目录不需要复制,运行时生成 COPY app.py . COPY api/ ./api/ COPY models/ ./models/ COPY services/ ./services/ COPY utils/ ./utils/ # 5. 验证模型文件是否存在 RUN if [ -d "models/bin/all-MiniLM-L6-v2" ]; then \ echo "✓ Model files found: models/bin/all-MiniLM-L6-v2"; \ ls -la models/bin/all-MiniLM-L6-v2/ | head -5; \ else \ echo "⚠ Warning: Model directory not found"; \ fi # 6. 创建非root用户(安全最佳实践) RUN useradd -m -u 1000 appuser && \ chown -R appuser:appuser /app USER appuser # 7. 创建日志目录(确保有写入权限) RUN mkdir -p /app/logs && chmod 755 /app/logs # 8. 暴露端口(Flask默认5000) EXPOSE 5000 # 9. 健康检查(可选) HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD python -c "import requests; requests.get('http://localhost:5000/health', timeout=5)" 2>/dev/null || exit 1 # 10. 启动应用 CMD ["python", "app.py"]