Образ собран под linux/amd64 и выложен как notbigghost/kbc2d — теги 1.0.0,
latest и 8d17bc8 указывают на один digest sha256:932d881d. В Dockerfile
добавлены метки OCI: версия, хеш коммита и ссылка на репозиторий, чтобы
образ на сервере однозначно сопоставлялся с состоянием исходников.
docker-compose.server.yml самодостаточен: тянет готовый образ из реестра,
исходников не требует, на сервер переносится одним файлом. Кампания —
единственный сервис, поднимающийся по up -d; проверки (vulkaninfo,
preflight, calibrate, dry-run) вынесены в профиль check и сами не
стартуют. Порядок проверок задан документацией: карта, сценарии,
калибровка, смета — и только потом счёт.
Политика перезапуска on-failure, а не unless-stopped: кампания завершается
штатно с кодом 0, и «перезапускать всегда» крутило бы контейнер вхолостую
по кругу, тогда как падение и перезагрузку хоста on-failure подхватывает,
а --resume продолжает с места. Журнал ограничен по размеру: девяносто
часов вывода иначе съедят диск, полные логи каждого прогона всё равно
лежат в out/<id>/log.txt.
Проверено локально из каталога без исходников: образ тянется из реестра,
смоук проходит, результаты ложатся на хост. Часть с картой проверяема
только на сервере — здесь запрос устройства ожидаемо отвергается
«no adapters were found», что само по себе подтверждает, что резервация
GPU в compose действует.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
60 lines
3.7 KiB
Docker
60 lines
3.7 KiB
Docker
# Образ для развёртывания решателя и валидационной кампании на сервере с 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"]
|