物理修复(400 失败点归因,见 docs/failed400_nan_pseudo_convergence_2026_08_17.md): - runner: 阶段 converged 后复查 fort.7,含 NaN/Inf 即否决(fort.9 全零伪收敛, 曾致 261 点误跳过 nl_direct 回退);否决阶段不产出种子,阻断污染传播 - runner: nl_tight 回退——仅能量边际失败时以 CHMAX 收紧 10× 从自身模型续迭代, 残差降幅 ~10×;execute_tlusty_stage 抽取供主链与回退共用 - conv_check: fort.14 为 Eddington 通量 Hλ,积分需乘 4π 再比 σTeff⁴ (旧版 ratio 稳定 0.0796=1/4π,全点系统性假阳性)+ 回归测试 - nst_writer: 单行超 80 字符被 TLUSTY 静默截断,IFALI/JALI/TRAD 等从未生效; 按 75 字符自动换行 - seed_finder: Teff 容忍度改含边界 <=,相邻 5000K 档恢复互为种子 + 回归测试 谱线表与网格: - 默认线表 gfVIS99 → gfATO(全波段 18-23000Å),TaskSpec.linelist 支持工作流 级覆盖,节点按需下载(进程互斥锁防并发重复下载 238MB) - sdB_cno Teff 加密至 5000K 步长,432 → 9216 点;tlusty/synspec 静态二进制更新 统计与部署: - grid 汇总改按 tlusty_status/synspec_status 分项计数,新增 tlusty_failed/ synspec_failed/synspec_pending,前端详情页双视图适配 - deploy/fetch_results 支持跳板机 ProxyJump 与 SSH 主连接复用,fetch 新增 --force; - Docker 构建支持 CARGO_MIRROR/USE_MIRRORS 国内镜像参数;移除 tools/ 拷贝 - 新增 tlusty-synspec-test skill 与 6 篇根因分析/验证文档
69 lines
2.8 KiB
Docker
69 lines
2.8 KiB
Docker
# =============================================================================
|
|
# DCTS Worker Node Dockerfile — Fortran (gfortran/BLAS/LAPACK) + Node Runner
|
|
# =============================================================================
|
|
|
|
# ─── Stage 1: Rust Node Worker 二进制编译 ────────────────────────────────────
|
|
FROM rust:1.94-alpine AS node-builder
|
|
|
|
# 国内(CN)网络构建时传 --build-arg USE_MIRRORS=1 切换 apk 源;默认关闭避免境外构建失败。
|
|
ARG USE_MIRRORS=0
|
|
|
|
RUN if [ "$USE_MIRRORS" = "1" ]; then \
|
|
sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories; \
|
|
fi
|
|
|
|
# 国内构建时传 --build-arg CARGO_MIRROR=1,将 crates.io 切换到 rsproxy 稀疏镜像。
|
|
ARG CARGO_MIRROR=0
|
|
RUN if [ "$CARGO_MIRROR" = "1" ]; then \
|
|
mkdir -p /usr/local/cargo && \
|
|
printf '[source.crates-io]\nreplace-with = "rsproxy-sparse"\n\n[source.rsproxy-sparse]\nregistry = "sparse+https://rsproxy.cn/index/"\n' \
|
|
> /usr/local/cargo/config.toml; \
|
|
fi
|
|
|
|
RUN apk add --no-cache musl-dev g++ make cmake pkgconfig sqlite-dev openssl-dev openssl-libs-static
|
|
WORKDIR /app
|
|
COPY Cargo.toml Cargo.lock ./
|
|
COPY crates/ ./crates/
|
|
COPY assets/tlusty_static assets/synspec_static ./assets/
|
|
RUN cargo build --release -p node && \
|
|
cp /app/target/release/node /usr/local/bin/dcts-node
|
|
|
|
# ─── Stage 2: 精简 Debian 运行环境镜像 (包含完整 glibc + libmvec + libgfortran) ─
|
|
#
|
|
# ⚠️ 重要:运行镜像必须为 glibc 系(debian/ubuntu),不可换 alpine/musl。
|
|
# assets/tlusty_static 与 synspec_static 是 gfortran/glibc 动态链接的 ELF(依赖
|
|
# libgfortran.so.5 / libmvec.so.1 / ld-linux-x86-64.so.2),在 musl 上无法执行。
|
|
# 若误改为 alpine 基础镜像,嵌入的二进制会以 "No such file or directory" 失败。
|
|
FROM debian:bookworm-slim
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libgfortran5 \
|
|
ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
|
|
|
# 创建非 root 账号管理运行
|
|
RUN groupadd -g 65532 dcts && useradd -u 65532 -g dcts -s /bin/bash dcts
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=node-builder /usr/local/bin/dcts-node /app/
|
|
|
|
RUN mkdir -p /app/data /app/data/logs /app/data/runtime /app/data/work /app/data/result /app/assets && \
|
|
chown -R dcts:dcts /app
|
|
|
|
USER dcts
|
|
|
|
ENV DCTS_SERVER_URL=http://dcts-server:8090
|
|
ENV DCTS_MAX_SLOTS=4
|
|
ENV DCTS_HEARTBEAT_SEC=15
|
|
ENV DCTS_RUNTIME_DIR=/app/data/runtime
|
|
ENV DCTS_WORK_DIR=/app/data/work
|
|
# node 完整计算结果归档目录(光谱/连续谱/各阶段产物)。旧名 DCTS_ARCHIVE_DIR 向后兼容回退。
|
|
ENV DCTS_RESULT_DIR=/app/data/result
|
|
ENV DCTS_ASSETS_DIR=/app/assets
|
|
ENV LOG_DIR=/app/data/logs
|
|
|
|
VOLUME ["/app/data"]
|
|
|
|
ENTRYPOINT ["/app/dcts-node"]
|