agentimg
General-purpose developer and agent foundation images inspired by boldsoftware/exeuntu, without bundled AI agents or Exe-specific components.
Contents
Images
| Variant | Contents | Base | Tags |
|---|---|---|---|
ubuntu-browser |
full toolset, systemd, headless Chromium | Ubuntu 24.04 | latest, ubuntu-browser, and ubuntu-browser-<12-char-commit-sha> on source changes |
ubuntu |
full toolset and systemd, no browser | Ubuntu 24.04 | ubuntu and ubuntu-<12-char-commit-sha> on source changes |
alpine-browser |
Alpine-equivalent toolset, OpenRC, Chromium | Alpine 3.21 | alpine-browser and alpine-browser-<12-char-commit-sha> on source changes |
alpine |
Alpine-equivalent toolset and OpenRC, no browser | Alpine 3.21 | alpine and alpine-<12-char-commit-sha> on source changes |
Pull from ghcr.io/hambn/agentimg:<tag> or docker.io/hambn/agentimg:<tag>.
Only a Git push that changes a variant creates its commit tag. Scheduled base-image
refreshes replace latest and the affected stable variant tag without creating another
tag. See the repository registry and tag guidance.
Included software
All variants provide a broad command-line development environment: styled Zsh and Bash, Git and Git LFS, GitHub and GitLab CLIs, the current stable Go toolchain, Python, pip/pipx, uv, the current Node.js LTS with npm/npx/pnpm/Yarn, kubectl, Helm, Kustomize, yq, compilers, CMake/Ninja/Autotools, editors, man pages, SSH, Docker/Buildx/Compose, Tailscale, Bubblewrap, mitmproxy, nginx, fd, HTTPie, ShellCheck, shfmt, yamllint, archive/compression utilities, and database/network/process diagnostics. Ubuntu includes systemd; Alpine maps the service capability to OpenRC. The terminal profile also includes fzf, tmux, Ghostty-compatible terminfo, autosuggestions, syntax highlighting, Git-aware prompts, persistent history, and case-insensitive completion.
The browser variants add headless Chromium. The Ubuntu variant uses the self-contained
chromedp/headless-shell bundle; Alpine uses its native Chromium package.
Deliberately excluded from all variants:
- Claude Code, Codex, Pi, and all other AI agents or agent configuration
- the Exeuntu CLI, Shelley, Exe setup services, branding, labels, and init wrapper
- Exe.dev nginx/site content, LLM gateway integration, and host-specific boot assumptions
Docker, nginx, SSH, and Tailscale are installed but not enabled automatically. Derived
images or privileged runtimes can opt into those daemons. Every variant defaults to the
unprivileged UID/GID-1000 sysadmin user and starts in /home/sysadmin; /workspace remains
available as an optional project mount for deployment examples.
Ubuntu systemd remains available when a privileged runtime explicitly selects root and
/sbin/init. Its container profile uses multi-user.target, console logging, a bounded
volatile journal, preserved /tmp, and lingering support for sysadmin. Hardware, boot,
getty, unattended-update, and host-managed resolver/udev units that do not belong in an
OCI container are masked. This is systemd support, not an attempt to start systemd from
the default non-root shell.
kubectl is checksum-verified from the official Kubernetes release service. Its Zsh
completion is initialized, ~/.kube is ready for a mounted configuration, and the shell
provides k, kc, and kn aliases for kubectl, current-context, and namespace changes.
Every build resolves the current gh, glab, stable Go, Node.js LTS, Helm, Kustomize,
yq, zsh-autosuggestions, and stable kubectl releases directly from their upstream
release services; there are no tool-version build arguments or fallback version
literals. npm installs the current pnpm and Yarn releases. GitHub Actions rebuilds all
variants every week.
Scheduled and manual builds bypass layer caches and refresh base images so those release
lookups and distribution package installs actually run. The CLI downloads are
checksum-verified, and each built digest must pass command, passwordless-sudo, shell,
agent-home, Docker CLI/Buildx/Compose, and browser-presence smoke checks before any
moving tag is published.
Each distro keeps its setup scripts in its own scripts/ directory. Distribution
updates, common packages, language runtimes, downloaded CLIs, system/user configuration,
and Zsh configuration use separate Dockerfile layers; uv, Go, and Node share one
language layer, while tool and user setup share one configuration layer. Build-only
scripts and configuration are bind-mounted into each RUN, so they are not stored in
image layers.
Docker CLI, Buildx, Compose, and the daemon binary are installed, but a daemon is not
started in the default non-root shell. Use an opt-in mounted socket or DOCKER_HOST for
an external daemon. A nested daemon requires runtime privileges; systemctl only works
when root systemd is actually PID 1, which ordinary Kubernetes development pods do not
provide.
Use cases
- Start an interactive workspace with Docker.
- Run through a reusable local definition with Docker Compose.
- Use a rootless container engine with Podman.
- Run a long-lived development pod with Kubernetes or Helm.
- Deploy a shared long-lived environment with Docker Swarm.
File map
agentimg/
├── README.md
├── images/
│ ├── alpine-browser.Dockerfile
│ ├── alpine.Dockerfile
│ ├── ubuntu-browser.Dockerfile
│ ├── ubuntu.Dockerfile
│ ├── alpine/
│ │ └── scripts/
│ │ ├── browser-packages.sh
│ │ ├── configure-zsh.sh
│ │ ├── configure.sh
│ │ ├── install-cli-tools.sh
│ │ ├── languages.sh
│ │ ├── packages.sh
│ │ └── update.sh
│ ├── common/
│ │ ├── zprofile
│ │ ├── zshenv
│ │ └── zshrc
│ └── ubuntu/
│ ├── journald-container.conf
│ ├── systemd-container.conf
│ ├── tmpfiles-tmp.conf
│ └── scripts/
│ ├── browser-packages.sh
│ ├── configure-systemd.sh
│ ├── configure-zsh.sh
│ ├── configure.sh
│ ├── install-cli-tools.sh
│ ├── install-tailscale.sh
│ ├── languages.sh
│ ├── packages.sh
│ └── update.sh
└── examples/
├── docker/
│ ├── README.md
│ ├── airgapped.run.sh
│ └── run.sh
├── docker-compose/
│ ├── README.md
│ ├── airgapped.docker-compose.yml
│ └── docker-compose.yml
├── docker-swarm/
│ ├── README.md
│ └── stack.yml
├── helm/
│ ├── README.md
│ └── chart/
│ ├── Chart.yaml
│ ├── templates/deployment.yaml
│ └── values.yaml
├── kubernetes/
│ ├── README.md
│ └── deployment.yaml
└── podman/
├── README.md
└── run.shCI is defined in .github/workflows/base-agentimg.yml.