# ============================================================================= # 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"]