Reorganize algorithm packages by business responsibility, move orchestration into services, and keep database access behind pooled repositories. Harden analysis API validation, remove unsafe legacy simulation endpoints, and add regression and architecture boundary coverage. BREAKING CHANGE: legacy algorithm module paths and obsolete simulation endpoints are removed.
35 lines
1.5 KiB
Docker
35 lines
1.5 KiB
Docker
FROM condaforge/miniforge3:latest
|
|
|
|
WORKDIR /app
|
|
|
|
ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
|
|
PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn \
|
|
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
|
|
|
# 安装 Python 3.12 和 pymetis (通过 conda-forge 避免编译问题)
|
|
RUN mamba install -y python=3.12 pymetis && \
|
|
mamba clean -afy
|
|
|
|
COPY requirements.txt .
|
|
RUN pip install --no-cache-dir uv
|
|
RUN uv pip install --system --no-cache-dir -r requirements.txt
|
|
|
|
# 本地数据目录和环境变量在运行时通过 Compose 挂载或注入,
|
|
# 不应进入镜像构建上下文。
|
|
COPY app ./app
|
|
COPY contracts ./contracts
|
|
COPY infra ./infra
|
|
COPY resources ./resources
|
|
COPY scripts/check_openapi.py ./scripts/check_openapi.py
|
|
COPY tests ./tests
|
|
RUN python -c "from pathlib import Path; from zipfile import ZipFile; model_dir = Path('app/algorithms/pipe_health_prediction/model'); zip_path = model_dir / 'my_survival_forest_model_quxi.zip'; joblib_name = 'my_survival_forest_model_quxi.joblib'; joblib_path = model_dir / joblib_name; assert zip_path.exists(), f'Model archive not found: {zip_path}'; archive = ZipFile(zip_path); archive.extract(joblib_name, model_dir); archive.close(); assert joblib_path.exists(), f'Model file not extracted: {joblib_path}'" && \
|
|
rm -f app/algorithms/pipe_health_prediction/model/my_survival_forest_model_quxi.zip
|
|
RUN mkdir -p db_inp temp data inp
|
|
|
|
# 设置 PYTHONPATH 以便 uvicorn 找到 app 模块
|
|
ENV PYTHONPATH=/app
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
|