diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..97a8492 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.git +.venv +venv +__pycache__ +*.pyc +.pytest_cache +*.egg-info +build +dist +out +.claude +*.sqlite3 +*.sqlite3-wal +*.sqlite3-shm diff --git a/.gitignore b/.gitignore index dd4f57d..ca9fcf4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,7 @@ dist/ *.sqlite3-wal *.sqlite3-shm out/ +results/* +!results/.gitkeep .DS_Store .claude/settings.local.json diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3c45da4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY pyproject.toml README.md ./ +COPY src ./src +COPY tests ./tests + +RUN pip install --no-cache-dir -e ".[dev]" + +# Не root: иначе всё, что контейнер пишет в примонтированный ./results +# (SQLite-база, отчёты), становится на хосте файлами root:root. +RUN useradd --create-home --uid 1000 gausse +RUN mkdir -p /app/results && chown -R gausse:gausse /app +USER gausse + +ENTRYPOINT ["gausse"] +CMD ["--help"] diff --git a/PLAN.md b/PLAN.md index 66fb446..139a9c2 100644 --- a/PLAN.md +++ b/PLAN.md @@ -34,6 +34,12 @@ L(x, I)-модель с coenergy-выводом силы — в разделе " Полный план архитектуры: см. историю обсуждения / `physics`, `sim`, `optim`, `storage`, `report` модули ниже. +**Docker — основной способ запуска** (по требованию пользователя): `Dockerfile` ++ `docker-compose.yml` в корне репозитория, образ собран и провалидирован — +внутри контейнера запускаются все 37 тестов и CLI (`docker compose run --rm +--entrypoint pytest gausse -q`). Результаты (SQLite и отчёты, когда появятся) +монтируются в `./results` на хосте, чтобы переживать пересборку образа. + ## Чек-лист этапов - [x] **Этап 0 — Скелет проекта**: `pyproject.toml`, `README.md`, `.gitignore`, пакеты `src/gausse/*`, этот файл, первый коммит. diff --git a/README.md b/README.md index 76b7f4d..1bdcc3d 100644 --- a/README.md +++ b/README.md @@ -5,16 +5,23 @@ Полный план и чек-лист этапов — в [PLAN.md](PLAN.md). -## Установка +## Установка (Docker — основной способ) + +```bash +docker compose build +docker compose run --rm --entrypoint pytest gausse -q # тесты +docker compose run --rm gausse sweep --n 1000 # CLI (после реализации Этапа 6) +``` + +Результаты (SQLite, отчёты) должны сохраняться в `./results`, примонтированный +в контейнер как `/app/results` (см. `docker-compose.yml`), чтобы переживать +пересборку образа. + +## Установка без Docker (локальная разработка) ```bash python3 -m venv .venv source .venv/bin/activate pip install -e ".[dev]" -``` - -## Тесты - -```bash pytest ``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..859b1c3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,7 @@ +services: + gausse: + build: . + volumes: + - ./results:/app/results + entrypoint: ["gausse"] + command: ["--help"] diff --git a/results/.gitkeep b/results/.gitkeep new file mode 100644 index 0000000..e69de29