diff --git a/docs/three-env-code-promote.md b/docs/three-env-code-promote.md index f6872dc..427c52d 100644 --- a/docs/three-env-code-promote.md +++ b/docs/three-env-code-promote.md @@ -167,24 +167,25 @@ $D run -d --init --name sanguo_vnpy_v2 \ **现状**:NAS 运行的 `sanguo_vnpy_v2:pre-init-rebuild` 是 **docker commit 快照链**(with-sqlite → 手动 pip 装 bullet-trade/jwt/… → commit),非从 Dockerfile 构建。手动装的包只活在容器层,**任何从 base 重建都会丢**。实测 `pre-init-rebuild` 比 `with-sqlite` 多 64 个包(含 jwt/bullet-trade/baostock/jqdatasdk/vnpy_ctastrategy/pytest/整个 jupyter 栈)。 -**已修(2026-08-01)**:`requirements-docker.txt` 补齐缺失的**顶层运行时**依赖(此前只在容器层手动装;transitive 会自动拉,不用列): -- `bullet-trade==0.9.2`(组合框架,import 名 `bullet_trade`) -- `jqdatasdk==1.9.8`(`import bullet_trade` 默认 provider=jqdata 触发 import,包须在;实跑用 LocalUnifiedProvider 不调 online) -- `vnpy_ctastrategy==1.4.1`(CTA 策略引擎,sanguo_backtest/sanguo_live 广用) -- `vnpy_sqlite==1.1.3`(vnpy sqlite 驱动,trader/database.py 运行时动态加载) +**构建走 `docker/Dockerfile`(单阶段自包含,2026-08-01 已验证+换装)**:FROM python:3.10-slim + 编译 TA-Lib + `pip install -r requirements-docker.txt` + COPY 代码。⚠️**不是** `Dockerfile.nas`(它 `FROM sanguo_vnpy:base` 是从未建成的 2-stage 残留,别用)。NAS 容器 bind-mount `/app` 提供运行时代码,镜像只需 Python+依赖层。 -四个均已确认公共 PyPI 可装,版本钉死=容器实证版。**不补**:`pyecharts`(0 import 残留)、jupyter 栈(交互开发 bloat,非运行时)。 +**已修(2026-08-01,均在 git)**: +- `requirements-docker.txt` 补缺失顶层运行时依赖:`bullet-trade==0.9.2`/`jqdatasdk==1.9.8`(bullet_trade import 链)/`vnpy_ctastrategy==1.4.1`/`vnpy_sqlite==1.1.3`。 +- `polars[rtcompat]==1.42.1`:NAS CPU(Synology Celeron)无 AVX2,plain polars `import` 即 SIGILL(exit132);[rtcompat] 拉 polars-runtime-compat 兜底。**勿放回 `>=` 松约束**(会拉到要 AVX2 的新版崩溃)。 +- `Dockerfile` pip+apt 都补清华镜像(原 pypi.org/deb.debian.org 国内不稳);加 `.dockerignore`(排 data_cache/frontend/venv 等,上下文 1.9G→~50MB)。 -**可复现重建步骤**(⚠️**待空闲验证**——现运行容器 02 回测在跑,别动;这是验证步骤,不是修复本身,修复已落到 requirements): +**可复现重建步骤(已实证)**: ```bash D=/var/packages/Docker/target/usr/bin/docker -# 1. 建 base(docker/Dockerfile 装完整 requirements-docker.txt;Dockerfile.nas 的 FROM sanguo_vnpy:base 依赖它) -$D build -f docker/Dockerfile -t sanguo_vnpy:base . -# 2. 建 app 层(Dockerfile.nas FROM base + COPY 代码) -$D build -f docker/Dockerfile.nas -t sanguo_vnpy_v2:reproducible . -# 3. 起测试容器带 --init(见 §9),用新名不占 sanguo_vnpy_v2 -$D run -d --init --name sanguo_repro_test -v <同挂载> -p 8001:8000 sanguo_vnpy_v2:reproducible -# 4. nas-verify(login+strategy/list+dbbardata) + 跑一次 03 短测确认组合链路(bullet_trade import 通) -# 5. 全过才换掉 sanguo_vnpy_v2;pre-init-rebuild 暂留回滚 +CTX=/volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2 +# 1. 单阶段构建(setsid/nohup 防 ssh 杀;log 落盘) +ssh sanguo-nas "cd $CTX && setsid $D build -f docker/Dockerfile -t sanguo_vnpy_v2:reproducible . > /tmp/repro_build.log 2>&1 &" +# 2. 起测试容器带 --init(见 §9),新名+8001 端口不占 sanguo_vnpy_v2 +$D run -d --init --name sanguo_repro_test -v $CTX:/app -v /volume1/stock:/volume1/stock -p 8001:8000 --network sanguo_vnpy_network -e DATA_DIR=$CTX sanguo_vnpy_v2:reproducible +# 3. 验证:nas-verify(8001 login+strategy/list+dbbardata) + 03 短测(bullet_trade 链路) +# 4. 全过才换主容器(见下);pre-init-rebuild image 留回滚 +# 5. 进程检测用 /proc//cmdline,别用 ps(此容器 ps 看不到 python,会误判) ``` -**遗留**:① 干净重建尚未实测(requirements 已对齐容器 216 包里的顶层子集,理论可复现,待 env 空闲验证);② `requirements-lock.txt`(==钉版基线)未同步这 4 包,且本身"当前未验",待统一。 +**换主容器**:`$D stop sanguo_vnpy_v2 && $D rm sanguo_vnpy_v2` → `$D run -d --init --name sanguo_vnpy_v2`(同 §9 挂载/端口/network/env) `sanguo_vnpy_v2:reproducible` → 8000 nas-verify。**回滚**:同命令换 image 为 `sanguo_vnpy_v2:pre-init-rebuild`。 + +**验证结果(2026-08-01)**:03 momentum_timing 短测 total_return 15.62%/sharpe 1.59/6 持仓;web/login/dbbardata 全过;reproducible 镜像已换上主容器(Init=true)。⚠️02/01 未单独实测(用同栈,理论同),策略 session 首跑若异常即回滚。