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

text
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.sh

CI is defined in .github/workflows/base-agentimg.yml.

Sources