fix(docker): install ripgrep and python deps for memory tools (#107)

* fix(docker): install ripgrep and python deps for memory tools

* docs(handoff): set PR number 107

* docs(project-map): update after dockerfile memory deps changes

* fix(docker): install deps in non-shadow paths /opt/memory and global npm

* docs(handoff): align with /opt/memory and global npm fix

---------

Co-authored-by: opencode-agent <agent@opencode.local>
This commit is contained in:
Sergey 2026-07-27 02:59:17 +03:00 committed by GitHub
parent 7d730baa4c
commit 9ebb6d2864
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 69 additions and 1 deletions

View file

@ -31,7 +31,13 @@ RUN curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/c
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
RUN npm install -g opencode-ai repomix --unsafe-perm RUN npm install -g opencode-ai repomix @vscode/ripgrep --unsafe-perm
COPY pyproject.toml uv.lock /opt/memory/
COPY src/ /opt/memory/src/
RUN cd /opt/memory && uv sync --no-dev --frozen
ENV PYTHONPATH=/opt/memory/src
ENV PATH=/opt/memory/.venv/bin:$PATH
WORKDIR /root/workspace WORKDIR /root/workspace

View file

@ -0,0 +1,25 @@
# ADR-048: Dockerfile — install ripgrep and python deps for memory tools
## Статус
Accepted (2026-07-26)
## Контекст
После удаления плагина `@mathew-cf/opencode-memory` (PR #103, ADR-045) его зависимости больше не ставятся в Docker-контейнер. Memory-инструменты (`memory-search.ts`, `python -m src.memory`) теперь живут в самом репо (`.opencode/tools/` + `src/memory/`), но их runtime-deps (`@vscode/ripgrep`, `httpx`, `numpy`, `tenacity`) не попадали в образ. Результат: `memory-search` падал на отсутствии binary `rg`, `python -m src.memory` — на `import httpx`. Память в контейнере не работала вообще.
## Решение
Добавить в `Dockerfile` два слоя установки deps после `npm install -g opencode-ai repomix`:
1. **Node runtime deps**`npm install -g @vscode/ripgrep` (глобально, в `/usr/local/lib/node_modules/`). Глобальная установка обходит bind-mount `./.opencode:/root/.config/opencode` который shadow'ит локальные node_modules в runtime.
2. **Python runtime deps**`COPY pyproject.toml uv.lock /opt/memory/` + `COPY src/ /opt/memory/src/` + `uv sync --no-dev --frozen` в `/opt/memory/` (вне shadow-пути `/root/workspace/`). `ENV PYTHONPATH=/opt/memory/src` + `ENV PATH=/opt/memory/.venv/bin:$PATH` делают `python3 -m src.memory` рабочим из любого cwd. Volume `./app_data/workspaces:/root/workspace` не shadow'ит `/opt/memory/`.
Контейнер становится самодостаточным: память работает из коробки после `docker compose up -d --build`.
## Альтернативы
- **Вернуть плагин `@mathew-cf/opencode-memory`** — отвергнуто в PR #103 (плагин удалён, инструменты мигрированы в репо).
- **Ставить deps через `apt-get`**`@vscode/ripgrep` и Python-пакеты не в Debian repos нужных версий; `uv`/`npm` дают детерминизм через lock-файлы.
- **Копировать весь `.opencode/` и `src/`** — раздувает образ; достаточно только manifest + lock для установки deps на этапе build.
- **Deps в `/root/.opencode/` + `/root/workspace/`** (первая попытка) — отвергнуто: bind-mount `./.opencode:/root/.config/opencode` и volume `./app_data/workspaces:/root/workspace` shadow'ят node_modules и `.venv/` в runtime. Deps установлены но не доступны. Исправлено: `/opt/memory/` (не shadow) + глобальный npm.

View file

@ -0,0 +1,36 @@
---
pr: 107
title: fix(docker): install ripgrep and python deps for memory tools
---
## Что сделано
Добавлены 2 шага в `Dockerfile` после `npm install -g opencode-ai repomix`:
1. **`@vscode/ripgrep`** — `npm install -g @vscode/ripgrep` (глобально, в `/usr/local/lib/node_modules/`). Нужен для keyword search в `memory-search.ts`. Глобальная установка обходит bind-mount `./.opencode:/root/.config/opencode` который shadow'ит локальные node_modules.
2. **Python deps (`httpx`, `numpy`, `tenacity`)**`COPY pyproject.toml uv.lock /opt/memory/` + `COPY src/ /opt/memory/src/` + `uv sync --no-dev --frozen` в `/opt/memory/` (вне shadow-пути `/root/workspace/`). `ENV PYTHONPATH=/opt/memory/src` + `ENV PATH=/opt/memory/.venv/bin:$PATH` делают `python3 -m src.memory` рабочим из любого cwd.
## Почему
После удаления плагина `@mathew-cf/opencode-memory` (PR #103) его deps больше не ставятся в контейнер. Без этого PR:
- `memory-search` падает — `@vscode/ripgrep` не установлен, binary `rg` отсутствует
- `python -m src.memory` падает — `import httpx` ModuleNotFoundError
- Память не работает в контейнере вообще
Первая попытка (коммит до `46eb81a`) ставила deps в `/root/.opencode/` и `/root/workspace/` — но volume `./app_data/workspaces:/root/workspace` shadow'ит `.venv/` и `src/`, а bind-mount `./.opencode:/root/.config/opencode` shadow'ит node_modules. Исправлено: deps в `/opt/memory/` (не shadow) + глобальный npm.
Этот PR закрывает дыру — контейнер теперь самодостаточный, память работает из коробки после `docker compose up -d --build`.
## Pending
## Watch out
- `npm install -g @vscode/ripgrep` — глобальная установка, обходит bind-mount shadow. Binary в `/usr/local/lib/node_modules/@vscode/ripgrep-linux-x64/bin/rg`.
- `/opt/memory/` — вне volume shadow, переживает пересборку. `.venv` в `/opt/memory/.venv/`.
- `PYTHONPATH=/opt/memory/src``import src.memory` работает из любого cwd (TS tools запускают `python3 -m src.memory` с `cwd: context.worktree`).
- `PATH=/opt/memory/.venv/bin:$PATH``python3` резолвится в `.venv/bin/python3` который видит httpx/numpy/tenacity.
- `uv sync --no-dev --frozen` строго по `uv.lock` — только runtime deps, детерминизм.
- Closes #108.

View file

@ -121,6 +121,7 @@ opencode-config/
├── .pre-commit-config.yaml # ruff + UV hooks ├── .pre-commit-config.yaml # ruff + UV hooks
├── docker-compose.yml # 2 services (dind + opencode), opencode_network, 4 bind mounts, port 4096 on 0.0.0.0 — PR#24, PR#51 ├── docker-compose.yml # 2 services (dind + opencode), opencode_network, 4 bind mounts, port 4096 on 0.0.0.0 — PR#24, PR#51
├── Dockerfile # node:22-trixie-slim (Debian 13 trixie, glibc 2.41) + uv + gh + chromium + docker.io + opencode-ai + repomix + cloudflared (@mathew-cf/opencode-memory REMOVED PR#103) — PR#24, PR#34, PR#57, PR#71, PR#103 ├── Dockerfile # node:22-trixie-slim (Debian 13 trixie, glibc 2.41) + uv + gh + chromium + docker.io + opencode-ai + repomix + cloudflared (@mathew-cf/opencode-memory REMOVED PR#103) — PR#24, PR#34, PR#57, PR#71, PR#103
│ # Memory deps install layers (PR#107): COPY .opencode/package.json → npm install --omit=dev (runtime: @vscode/ripgrep for memory-search.ts); COPY pyproject.toml uv.lock → uv sync --no-dev --frozen (runtime: httpx, numpy, tenacity for python -m src.memory)
├── .env.example # Placeholder-only env template (user copies to .env) — PR#24, PR#34 (TUNNEL_DOMAIN), PR#36 (OPENCODE_MEMORY_REMOTE/DIR), PR#106 (AI_PROVIDER_* removed, OPENCODE_MEMORY_REMOTE now optional) ├── .env.example # Placeholder-only env template (user copies to .env) — PR#24, PR#34 (TUNNEL_DOMAIN), PR#36 (OPENCODE_MEMORY_REMOTE/DIR), PR#106 (AI_PROVIDER_* removed, OPENCODE_MEMORY_REMOTE now optional)
├── app_data/ ├── app_data/
│ ├── opencode-memory/ # Persistent memory (separate git repo, gitignored) — PR#36 │ ├── opencode-memory/ # Persistent memory (separate git repo, gitignored) — PR#36