# Образ для развёртывания решателя и валидационной кампании на сервере с NVIDIA.
#
# Сборка и запуск:
#   docker build -t kbc2d docs/theory/2d_solver
#   docker run --rm --gpus all kbc2d --calibrate            # проверить, что GPU виден
#   docker run -d  --gpus all -v "$PWD/out:/work/bench/out" --name kbc2d kbc2d --resume
#
# ГЛАВНАЯ ТОНКОСТЬ — Vulkan в контейнере. NVIDIA Container Toolkit подкладывает внутрь
# Vulkan-ICD (nvidia_icd.json) только если в NVIDIA_DRIVER_CAPABILITIES есть `graphics`.
# С одним `compute` wgpu не увидит НИ ОДНОГО адаптера и решатель откажется стартовать с
# --backend gpu. Поэтому capabilities прописаны в образе, а vulkan-tools положен внутрь,
# чтобы первым делом можно было выполнить `vulkaninfo` и убедиться, что карта видна.

# ── сборка ───────────────────────────────────────────────────────────────────
# Версия тулчейна закреплена: та же, на которой решатель собирался и проверялся.
FROM rust:1.97-bookworm AS build
WORKDIR /src

# Сначала только манифесты — тогда слой с зависимостями переиспользуется, пока они не менялись.
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo 'fn main() {}' > src/main.rs \
 && cargo build --release --locked 2>/dev/null || true \
 && rm -rf src

COPY src ./src
# touch нужен, чтобы cargo не спутал новые исходники с заглушкой из слоя выше
RUN touch src/main.rs && cargo build --release --locked

# ── исполнение ───────────────────────────────────────────────────────────────
FROM debian:bookworm-slim

# Версия и коммит приходят снаружи (см. bench/publish.sh): образ на сервере должен
# однозначно сопоставляться с состоянием репозитория, из которого собран.
ARG VERSION=dev
ARG REVISION=unknown
LABEL org.opencontainers.image.title="kbc2d"
LABEL org.opencontainers.image.description="Двумерный решатель LBM D2Q9 с энтропийным столкновением KBC"
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.revision="${REVISION}"
LABEL org.opencontainers.image.source="https://gitea.arseniev.info/NotBigGhost/TurbulenceCAD"

RUN apt-get update && apt-get install -y --no-install-recommends \
        libvulkan1 vulkan-tools python3 ca-certificates \
 && rm -rf /var/lib/apt/lists/*

# Без graphics в списке возможностей Vulkan-ICD внутрь не попадёт — см. шапку.
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics

WORKDIR /work
COPY --from=build /src/target/release/kbc2d /work/target/release/kbc2d
COPY bench /work/bench
RUN chmod +x /work/bench/run_campaign.sh

# Кампания идёт десятки часов, поэтому по умолчанию образ НЕ запускает её: случайный
# `docker run` покажет смету и выйдет.
WORKDIR /work/bench
ENTRYPOINT ["./run_campaign.sh"]
CMD ["--dry-run"]
