* 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>
5.5 KiB
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-slimdocker-compose.yml— без правок (serviceopencodeиспользует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 -gline (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паттерну и не создал дубликат.