opencode-config/docs/handoff/pr-71-base-image-trixie-slim.md
Sergey 92d21a142c
fix(docker): use node:22-trixie-slim instead of non-existent node:22-noble-slim (#73)
* fix(docker): use node:22-trixie-slim instead of non-existent noble-slim

* docs(adr): update ADR-030 for trixie-slim base image

* docs(handoff): update handoff for trixie-slim and add watch out note

* docs(handoff): set PR number

* docs(handoff): add handoff for PR#73

* fix(ci): drop dangling ADR-031 ref in pr-73 handoff

* docs(adr): add ADR-031 for PR#73 trixie-slim base image

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-07-26 04:43:03 +03:00

31 lines
No EOL
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
pr: 71
title: fix(docker): switch base image to node:22-trixie-slim for rag-cli GLIBC compat
---
## Что сделано
Сменён Docker base image с несуществующего `node:22-noble-slim` (Ubuntu 24.04 Noble, glibc 2.39) на реальный `node:22-trixie-slim` (Debian 13 trixie, glibc 2.41, Node 22 LTS) — однострочное изменение `FROM` в `Dockerfile:1`. Все остальные RUN layers, apt-пакеты, npm install, ENV, ENTRYPOINT — без изменений (проверено по пакетам: docker.io, ffmpeg — ✓; uv, gh, cloudflared — ставятся вне apt; chromium — обычный apt-пакет на Debian, не snap).
- `Dockerfile:1``FROM node:22-noble-slim``FROM node:22-trixie-slim`
- `docker-compose.yml` — без правок (service `opencode` использует `build: { context: ., dockerfile: Dockerfile }`, base image берётся из Dockerfile; pinned тегов image или упоминаний Node 20/Debian 12 в compose нет)
- `README.md` — без правок (упоминаний «Node 20», «node:20», «Debian 12», «bookworm» в README нет)
- `docs/decisions/030-pr-71-base-image-trixie-slim.md` — обновлённый ADR-030: указан реальный тег trixie-slim, пояснена ошибка PR#71 (noble-slim не существует в Docker Hub, node images только на Debian), chromium snap problem отпадает, добавлены альтернативы (`node:lts-trixie-slim`, `node:trixie-slim`)
## Почему
`@mathew-cf/opencode-memory` plugin тянет `@mathew-cf/rag-cli` как dependency для semantic search. RAG CLI — Rust native binary, требует **GLIBC_2.39**, но `node:20-slim` (Debian Bookworm) поставляется с **GLIBC 2.36** → binary падает, semantic search молча неработоспособен, `memory_search` деградирует к keyword-only (grep).
ADR-024 (PR #57) зафиксировал это как «известная проблема, НЕ блокер» и явно отметил: «Полный fix semantic search (смена base image) — вне scope этого PR». PR #71 = тот самый follow-up.
Все 5 опубликованных версий `@mathew-cf/rag-cli-linux-x64` (0.4.0, 0.5.0, 0.6.0, 0.7.0, 1.0.0) требуют GLIBC_2.39. Сменить хост нельзя: opencode работает **внутри контейнера**, хост изолирован. Смена base image на `node:22-trixie-slim` (Debian 13 trixie, glibc 2.41 ≥ 2.39) — минимальное изменение, изолированное от хоста, без сборки rag-cli из исходников.
## Pending
- Файл `docs/decisions/030-pr-71-base-image-trixie-slim.md` и этот handoff содержат placeholder `PR#73` — после `create_pr` полученный PR номер вписан в ADR (`PR#73 (этот)`). Frontmatter handoff (`pr: 71`) сохранён — это номер исходного PR#71, который этот PR исправляет, а не номер текущего PR.
## Watch out
- **PR#71 использовал несуществующий тег `node:22-noble-slim` — пересборка падала с `not found`. Исправлено в PR#73 (этот PR) на реальный тег `node:22-trixie-slim`. Урок: проверять существование тега через Docker Hub API перед коммитом.**
- **chromium snap problem отпадает на Debian 13 trixie** — Debian НЕ использует snap (в отличие от Ubuntu noble). `chromium` ставится через `apt-get install -y chromium` как обычный пакет, реальный browser, не transitional wrapper. Puppeteer-интеграция (`PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium`, `PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true`) работает as-is. Known limitation из PR#71 отпадает.
- **Тесты `tests/test_dockerfile.py` НЕ проверяют `FROM` строку** — тесты проверяют только `npm install -g` line (3 пакета: opencode-ai, repomix, @mathew-cf/opencode-memory) + regression guards. Смена `FROM` не сломает существующие тесты. Регрессионный тест на `FROM node:22-trixie-slim` НЕ добавлен (issue не просит, не плодить лишнее).
- **package-lock.json untracked** (`.opencode/package-lock.json`) — не относится к этому PR (зафиксировано в pr-69 handoff), не коммитить.
- **Node 20 → 22 LTS** — мажорное обновление Node. Все установленные npm-пакеты (opencode-ai, repomix, @mathew-cf/opencode-memory) совместимы с Node 22 (проверено по их package.json engines). Если обнаружится несовместимость — отдельный fix PR.
- **scaffold-handoff.sh** — нумерация ADR по `ls docs/decisions | grep -E '^[0-9]{3}-' | wc -l + 1` = 030 (после ADR-029). ADR создан вручную ДО scaffold с placeholder в имени (`030-pr-71-...`), scaffold нашёл существующий файл по `*-pr-71-base-image-trixie-slim.md` паттерну и не создал дубликат.