* 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>
32 lines
No EOL
6.3 KiB
Markdown
32 lines
No EOL
6.3 KiB
Markdown
---
|
||
pr: 73
|
||
title: fix(docker): use node:22-trixie-slim instead of non-existent noble-slim
|
||
---
|
||
|
||
## Что сделано
|
||
Follow-up к PR#71 (который переключил base image на `node:22-trixie-slim`, но коммитил через PR#71 с placeholder'ом в ADR). PR#73 закрывает хвосты PR#71: обновляет ADR-030 (переименован в `030-pr-71-base-image-trixie-slim.md`, контент обновлён под реальный тег), переименовывает handoff `pr-71-base-image-noble-slim.md` → `pr-71-base-image-trixie-slim.md`, обновляет project map. Сам Docker base image (`Dockerfile:1` `FROM node:22-trixie-slim`) **уже был сменён в PR#71** — в PR#73 правок кода нет.
|
||
|
||
Конкретно:
|
||
- `Dockerfile:1` — без правок в этом PR (`FROM node:22-trixie-slim` уже стоит из PR#71)
|
||
- `docs/decisions/030-pr-71-base-image-trixie-slim.md` — ADR-030 переименован с `030-pr-71-base-image-noble-slim.md`, контент обновлён: указан реальный тег trixie-slim, пояснена ошибка PR#71 (noble-slim не существует в Docker Hub, node images публикуются только на Debian), chromium snap problem отпадает, добавлены альтернативы (`node:lts-trixie-slim`, `node:trixie-slim`)
|
||
- `docs/handoff/pr-71-base-image-trixie-slim.md` — переименован с `pr-71-base-image-noble-slim.md`, контент обновлён под trixie-slim
|
||
- `docs/project-map/README.md` — теги PR#73 на затронутых строках
|
||
- этот handoff `pr-73-base-image-trixie-slim.md` — создан, потому что `pipeline-status.py` ищет handoff по **PR номеру** (`pr-<PR>-*.md`), а PR#71 handoff назван по issue/исходному PR и не матчится на PR#73
|
||
|
||
## Почему
|
||
PR#71 изначально использовал несуществующий тег `node:22-noble-slim` — Docker Hub API возвращает `count=0` для этого тега (node images публикуются только на Debian: bookworm, bullseye, trixie; Ubuntu noble — только для официального ubuntu образа, не для node). Пересборка падала с `manifest unknown`. `node:22-trixie-slim` — реальный тег (Debian 13 trixie, glibc 2.41 ≥ 2.39, Node 22 LTS), решает ту же задачу PR#71: `@mathew-cf/rag-cli` Rust native binary требует GLIBC_2.39, а `node:20-slim` (Debian Bookworm, glibc 2.36) слишком старый.
|
||
|
||
Debian 13 trixie НЕ использует snap (в отличие от Ubuntu noble) → chromium ставится через `apt-get install -y chromium` как обычный пакет, не transitional wrapper. Known limitation из PR#71 (chromium snap problem) отпадает.
|
||
|
||
## Pending
|
||
— после merge PR#73:
|
||
- Пересборка Docker образа локально (`docker compose build`), проверка что `FROM node:22-trixie-slim` резолвится с Docker Hub без `manifest unknown`
|
||
- Проверка `rag --version` внутри контейнера (`docker compose run --rm opencode rag --version`) — подтверждает что GLIBC_2.39 доступен и semantic search работоспособен
|
||
- memory update `technical/opencode-log-subagent-stumbles-analysis.md` (noble-slim не существует → trixie-slim) — на фазе MEMORY через memory-syncer subagent, если pipeline дойдёт
|
||
|
||
## Watch out
|
||
- **`commit` tool делает `git add -A` под капотом** — staged-группировка НЕ сохраняется. Если в индексе есть лишние файлы (например `package-lock.json`), они уйдут в коммит вместе с целевыми. Урок: проверять `git status` перед `commit` и `git reset` лишнее заранее. Но `git reset *` заблокирован deny в `opencode.json:311-314` — нельзя перемотать неудачный коммит через raw bash. Workaround: новый `commit --amend` тоже не доступен (tool не принимает `--amend`), только новый коммит поверх.
|
||
- **Урок PR#71: проверять существование Docker тега через Docker Hub API перед коммитом.** `curl -s "https://hub.docker.com/v2/repositories/library/node/tags/noble-slim/" | jq .` — `name: null` = тег не существует. `trixie-slim` возвращает `name: "trixie-slim"`. Также `curl -s "https://hub.docker.com/v2/repositories/library/node/tags?page_size=100&name=trixie"` — список реальных trixie тегов.
|
||
- **scaffold-handoff.sh создаёт и ADR, и handoff** — для этого PR ADR уже существовал (030-pr-71-...), но паттерн поиска `*-pr-<PR>-<slug>.md` использует PR=73 → не нашёл 030-pr-71 → создал пустой файл `031-pr-73-*.md`. Лишний файл `031-pr-73` удалён вручную (`rm`, не `git rm` — файл ещё не в индексе). Если scaffold запускается после переименования ADR с другим PR-номером — нужно либо переименовать ADR ДО scaffold под целевой PR, либо удалять дубликат после.
|
||
- **pipeline-status.py ищет handoff по PR-номеру, НЕ issue-номеру** — конвенция репо: `pr-<PR>-<slug>.md`. PR#71 handoff назван по исходному PR#71 (который этот PR исправляет), поэтому pipeline-status для PR#73 не находил его → нужен отдельный `pr-73-*.md`. См. memory `technical/video_uniq-pr51-channel-profile-discoveries.md` §2.
|
||
- **`.opencode/package-lock.json` untracked** — не относится к этому PR (зафиксировано в pr-69 handoff), не коммитить. `git status` показывает его как untracked — нужно игнорировать при `commit` (tool сделает `git add -A`, если файл не в `.gitignore` → уйдёт в коммит). |