| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- # Dockerfile for AIServ
- # 使用 Python 3.11(稳定兼容)
- FROM docker.m.daocloud.io/library/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 \
- --index-url https://pypi.tuna.tsinghua.edu.cn/simple \
- --trusted-host pypi.tuna.tsinghua.edu.cn \
- 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"]
|