---
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` паттерну и не создал дубликат.