Files
images/README.md
T
rmcguireandClaude Opus 5 1878df96ac
Lint / lint (push) Failing after 34s
Build Images / ${{ fromJSON(needs.select.outputs.images) }} (push) Canceled after 7m37s
Build Images / Select images (push) Successful in 17s
Initial commit: image registry structure and node-agent
Set up this repo as a base image registry. Each image is self-contained in
its own directory under images/ (Dockerfile + README.md + optional test.sh);
CI discovers them by glob, so adding an image needs no workflow changes.
template/ is the skeleton to copy.

The Makefile is the single entry point for both local work and CI, so a green
`make all` locally means a green pipeline.

Workflows:
  * lint.yaml  — layout check, hadolint, shellcheck
  * build.yaml — diffs against the base commit to build only the images that
    changed, smoke-tests each one before anything is published, then pushes.
    Releases are per-image tags (<image>/vX.Y.Z); main publishes :edge.

First image, node-agent: node:22-alpine plus a GNU userland (Alpine ships
BusyBox, whose applets take narrower flags than scripts and models expect),
helm, kubectl, jq, yq, bind-tools, curl, git, ripgrep, fd and friends.
Nothing is version-pinned — rebuilding is how upstream updates land, and the
published tag is what pins things for consumers.

Its smoke test asserts the deployment contract as well as tool presence: the
image must work non-root, with a read-only root filesystem and all
capabilities dropped, which is how ToolHive runs it.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-08-09 11:40:29 -04:00

2.2 KiB

images

Custom container images, published to the public rmcguire registry on Gitea.

Each image is self-contained in its own directory under images/: a Dockerfile, a README.md, and an optional test.sh.

Images

Image Base Purpose
node-agent node:22-alpine Node 22 plus a GNU shell, network and Kubernetes toolchain — a general-purpose command execution environment for AI agents

Pulling

docker pull gitea.libretechconsulting.com/rmcguire/node-agent:latest

The registry is public, so no pull secret is required.

Tags

Tag Points at
vX.Y.Z / vX.Y / vX a released build
latest the most recent release
edge the current tip of main
main-<sha> one specific commit on main

Releases are cut per image by pushing a tag named <image>/vX.Y.Z, which builds and publishes that image alone:

git tag node-agent/v1.0.0 && git push origin node-agent/v1.0.0

Base images and package versions are deliberately not pinned — rebuilding is how upstream updates land, and the published tag is what pins things for whoever pulls it.

Adding an image

cp -r template images/my-image
  1. Edit images/my-image/Dockerfile, or base it on an image already published here (FROM gitea.libretechconsulting.com/rmcguire/node-agent:latest).
  2. Fill in images/my-image/README.md.
  3. Extend images/my-image/test.sh to assert whatever the image promises.
  4. make build test IMAGE=my-image

CI needs no changes — it discovers every directory under images/ that contains a Dockerfile.

Local development

make help                        # list targets
make all                         # everything CI does
make build test IMAGE=node-agent # one image

CI

Two Gitea workflows, both of which just call the make targets above:

  • lint.yaml — repository layout, hadolint, shellcheck.
  • build.yaml — builds only the images whose files changed, smoke-tests each one before anything is published, then pushes on main or a release tag.