opencode-config/docs/handoff/pr-71-base-image-noble-slim.md
Sergey ac56596aed
fix(docker): switch base image to node:22-noble-slim for rag-cli GLIBC compat (#71)
* fix(docker): switch base image to node:22-noble-slim

* docs(adr): add ADR-030 for base image switch

* docs(handoff): add handoff for base image switch

* docs(handoff): set PR number

* docs(handoff): replace PR-NUMBER placeholder with 71

* docs(project-map): update Dockerfile description after base image switch

---------

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

30 lines
No EOL
5.5 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-noble-slim for rag-cli GLIBC compat
---
## Что сделано
Сменён Docker base image с `node:20-slim` (Debian 12 Bookworm, glibc 2.36) на `node:22-noble-slim` (Ubuntu 24.04 Noble, glibc 2.39) — однострочное изменение `FROM` в `Dockerfile:1`. Все остальные RUN layers, apt-пакеты, npm install, ENV, ENTRYPOINT — без изменений (проверено по пакетам: docker.io, ffmpeg — ✓; uv, gh, cloudflared — ставятся вне apt; chromium — known limitation, см. ниже).
- `Dockerfile:1``FROM node:20-slim``FROM node:22-noble-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 нет — issue явно просит не плодить лишнее)
- `docs/decisions/030-pr-71-base-image-noble-slim.md` — новый ADR-030 (следующий свободный номер после 029) с обоснованием выбора, проверкой пакетов на noble, known limitation по chromium snap, и 5 альтернативами
## Почему
`@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 (CI плагина собирается на `ubuntu-latest` = 24.04 Noble, glibc 2.39). Сменить хост нельзя: opencode работает **внутри контейнера**, хост изолирован. Смена base image на `node:22-noble-slim` — минимальное изменение, изолированное от хоста, без сборки rag-cli из исходников.
## Pending
- Файл `docs/decisions/030-pr-71-base-image-noble-slim.md` и этот handoff содержат placeholder `<71>` — после `create_pr` полученный PR номер надо вписать в frontmatter handoff (`pr:`) и в имя/контент ADR, отдельным коммитом `docs(handoff): set PR number`.
## Watch out
- **chromium snap на Ubuntu 24.04 Noble — KNOWN LIMITATION, НЕ блокер.** На noble `chromium` — virtual package, предоставляемый `chromium-browser` (transitional → chromium snap). Snap в Docker-контейнере без systemd не запускается. `chromium-browser` (48.9kB transitional) ставится через apt, тянет `snapd`, но реальный snap-бинарник chromium не запустится без snap-демона. Puppeteer-интеграция (`PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium`, `PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true`) деградирует — `/usr/bin/chromium` будет transitional wrapper, не реальный browser. Chromium используется опционально (browser MCP tools), НЕ основным entrypoint opencode. Issue #70 явно просит смену base image «точно, без отклонений» — без обходов chromium-snap. Workaround (вне scope): Playwright install или сторонний PPA — отдельный PR при необходимости.
- **Тесты `tests/test_dockerfile.py` НЕ проверяют `FROM` строку** — тесты проверяют только `npm install -g` line (3 пакета: opencode-ai, repomix, @mathew-cf/opencode-memory) + regression guards. Смена `FROM` не сломает существующие тесты. Регрессионный тест на `FROM node:22-noble-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-noble-slim.md` паттерну и не создал дубликат.