79441a8a87
D4 文档/规划/历史混放收口:
- docs/TECH_DEBT.md §2 由'按批次回顾'精简为'按主题摘要',
与§3重复内容(批次0-4详细展开)整体迁入
docs/archive/2026-09_governance_batches.md
- docs/STATUS.md 顶部 2026-09-17 之前条目迁入
docs/archive/2026-09_status_history.md,仅保留指针
- D2 历史口径补齐为 2026-09-18 批次4后续专项清偿
- D4 标已清偿
- AGENTS.md / docs/archive/README.md 同步导航
D13 锁文件流程固化(镜像引入主体已清偿,仅剩锁文件落盘):
- 新增 deploy/generate_lockfiles.{sh,bat}:在 moldinsight conda
环境(仅项目依赖)执行 pip freeze --exclude pythonocc-core,
产出 deploy/requirements-{base,moldinsight}.lock.txt
- deploy/Dockerfile.moldinsight 注释改为指向生成脚本
- docs/OPERATIONS.md §2.1 增加完整流程说明
- tests/test_lockfile_generation.py 加锁文件存在性+体积契约;
tests/conftest.py 注册 --run-lockfile-check 选项,
默认 skip(仓库单测不阻塞),CI 镜像构建 job 显式启用 fail-fast
遗留:锁文件本身尚未落盘(本机Miniforge跨项目开发栈混装,
污染严重不能直接 pip freeze);待 CI / 生产首次构建时按流程落锁。
测试基线:126 passed, 9 skipped(默认4原有skip + D13新增5skip;
启用 --run-lockfile-check 时严格断言2项锁文件契约)
Co-Authored-By: Claude Code <noreply@anthropic.com>
50 lines
2.0 KiB
Docker
50 lines
2.0 KiB
Docker
# PythonOCC 仅经 conda-forge 提供,且其动态库与 conda Python 的 ABI 绑定。
|
||
# 旧方式(conda 环境装好后把 site-packages 拷入 python:slim 系统 python)依赖
|
||
# 两侧 Python ABI 恰好兼容,属脆弱做法(TECH_DEBT D13);现改为直接以同一
|
||
# conda 运行时作为最终镜像的执行环境,自带全部动态库。
|
||
FROM continuumio/miniconda3:24.7.1-0
|
||
|
||
# 锁定几何栈核心版本;pip 侧全量版本锁由
|
||
# `bash deploy/generate_lockfiles.sh` 在 moldinsight conda 环境内执行后生成
|
||
# (D13,参见 deploy/generate_lockfiles.sh / .bat 与 docs/OPERATIONS.md §2)
|
||
# 落盘产物为 deploy/requirements-{base,moldinsight}.lock.txt,CI / 离线构建可直接锁定安装
|
||
RUN conda create -n moldinsight -c conda-forge -y \
|
||
python=3.12 \
|
||
pythonocc-core=7.9.0 \
|
||
&& conda clean -afy
|
||
|
||
ENV PATH=/opt/conda/envs/moldinsight/bin:$PATH \
|
||
PYTHONUNBUFFERED=1
|
||
|
||
WORKDIR /app
|
||
|
||
# 自包含构建:不再基于 gemold-base,基础依赖与模块依赖一并安装
|
||
COPY deploy/requirements-base.txt deploy/requirements-moldinsight.txt ./
|
||
RUN pip install --no-cache-dir \
|
||
-r requirements-base.txt \
|
||
-r requirements-moldinsight.txt \
|
||
&& rm requirements-base.txt requirements-moldinsight.txt
|
||
|
||
COPY src/shared/ /app/src/shared/
|
||
COPY src/moldinsight/ /app/src/moldinsight/
|
||
COPY src/inventory/ /app/src/inventory/
|
||
COPY src/entrypoints/ /app/src/entrypoints/
|
||
COPY src/celery_app.py src/celery_tasks.py /app/src/
|
||
|
||
# init_db 启动期自动迁移(AUTO_MIGRATE)需要迁移脚本随镜像分发
|
||
COPY migrations/ /app/migrations/
|
||
COPY alembic.ini /app/alembic.ini
|
||
|
||
COPY uploads/ /app/uploads/
|
||
|
||
ENV PYTHONPATH=/app/src
|
||
|
||
RUN mkdir -p /app/logs
|
||
|
||
EXPOSE 8000
|
||
|
||
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=60s \
|
||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1
|
||
|
||
CMD ["python", "-m", "uvicorn", "entrypoints.moldinsight:app", "--host", "0.0.0.0", "--port", "8000"]
|