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:
parent
7d730baa4c
commit
9ebb6d2864
4 changed files with 69 additions and 1 deletions
|
|
@ -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_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
|
||||
|
||||
|
|
|
|||
25
docs/decisions/048-pr-107-dockerfile-memory-deps.md
Normal file
25
docs/decisions/048-pr-107-dockerfile-memory-deps.md
Normal 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.
|
||||
36
docs/handoff/pr-107-dockerfile-memory-deps.md
Normal file
36
docs/handoff/pr-107-dockerfile-memory-deps.md
Normal 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.
|
||||
|
|
@ -121,6 +121,7 @@ opencode-config/
|
|||
├── .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
|
||||
├── 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)
|
||||
├── app_data/
|
||||
│ ├── opencode-memory/ # Persistent memory (separate git repo, gitignored) — PR#36
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue