Containers: image build + multi-arch publish #18

Closed
opened 2026-04-17 12:43:11 +00:00 by claude-desktop · 0 comments
Collaborator

User story

As an operator, I want a single multi-arch Docker image that bundles every runtime worker dependency (Bun, git, forgejo-mcp, Claude Code CLI), published to the Forgejo registry on release, so that the container-runtime story (#19) has a stable image to pull.

Split out of the original containerisation story (#17).

Acceptance criteria

Image

  • Dockerfile in the repo root
  • Base: debian:bookworm-slim pinned by digest
  • Non-root claude user with an empty $HOME at /home/claude
  • Installs: bun (pinned), git, forgejo-mcp (decide: AUR binary vs. build-from-source vs. registry download — document), python3, Claude Code CLI (pinned version)
  • Builds on linux/amd64 and linux/arm64 via docker buildx
  • Target image size < 500 MB
  • .dockerignore excludes node_modules, .cache, test output, etc.

CI

  • .forgejo/workflows/release.yml gains a publish-image job that runs after the build-x86_64 / build-aarch64 jobs and pushes both latest and v${VERSION} tags to the Forgejo registry
  • Image digest is recorded in the release notes
  • .forgejo/workflows/qa.yml builds the image on every push (no publish) to catch Dockerfile regressions early

Tests

  • CI smoke test: run the built image with --rm and exercise bun --version, git --version, forgejo-mcp --help, Claude Code CLI help
  • CI filesystem check: confirm the image contains no .claude.json, no .credentials.json, no .config/claude-hooks anywhere

Out of scope

  • Runtime orchestration (per-agent containers, tokens, volumes) — #19
  • just recipes, systemd, rolling updates, README — #20
  • Rootless Docker, seccomp, AppArmor profiles — revisit after measuring

References

  • Parent tracking issue: #17
  • Security incident motivating the milestone: 2026-04-17 dev-agent identity leak (commit bab386a)

Dependencies

  • Blocked by: none
  • Blocks: #19 (runtime)
  • Branch off: main
  • Full graph: #17
## User story As an **operator**, I want a single multi-arch Docker image that bundles every runtime worker dependency (Bun, git, forgejo-mcp, Claude Code CLI), published to the Forgejo registry on release, so that the container-runtime story (#19) has a stable image to pull. Split out of the original containerisation story (#17). ## Acceptance criteria ### Image - [ ] `Dockerfile` in the repo root - [ ] Base: `debian:bookworm-slim` pinned by digest - [ ] Non-root `claude` user with an empty `$HOME` at `/home/claude` - [ ] Installs: `bun` (pinned), `git`, `forgejo-mcp` (decide: AUR binary vs. build-from-source vs. registry download — document), `python3`, Claude Code CLI (pinned version) - [ ] Builds on `linux/amd64` and `linux/arm64` via `docker buildx` - [ ] Target image size < 500 MB - [ ] `.dockerignore` excludes `node_modules`, `.cache`, test output, etc. ### CI - [ ] `.forgejo/workflows/release.yml` gains a `publish-image` job that runs after the `build-x86_64` / `build-aarch64` jobs and pushes both `latest` and `v${VERSION}` tags to the Forgejo registry - [ ] Image digest is recorded in the release notes - [ ] `.forgejo/workflows/qa.yml` builds the image on every push (no publish) to catch Dockerfile regressions early ### Tests - [ ] CI smoke test: run the built image with `--rm` and exercise `bun --version`, `git --version`, `forgejo-mcp --help`, Claude Code CLI help - [ ] CI filesystem check: confirm the image contains no `.claude.json`, no `.credentials.json`, no `.config/claude-hooks` anywhere ## Out of scope - Runtime orchestration (per-agent containers, tokens, volumes) — #19 - `just` recipes, systemd, rolling updates, README — #20 - Rootless Docker, seccomp, AppArmor profiles — revisit after measuring ## References - Parent tracking issue: #17 - Security incident motivating the milestone: 2026-04-17 dev-agent identity leak (commit `bab386a`) ## Dependencies - **Blocked by:** none - **Blocks:** #19 (runtime) - **Branch off:** `main` - **Full graph:** #17
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#18
No description provided.