Lean Ubuntu devcontainer base — dev toolset, non-root sudo user, multi-arch amd64/arm64
673
A lean Ubuntu devcontainer base image with a standard dev toolset
and a passwordless-sudo vscode user. Multi-arch (amd64 / arm64).
| Tag | Base | Notes |
|---|---|---|
26.04, latest | ubuntu:26.04 | LTS — the default, latest always points here |
26.10 | ubuntu:26.10 | |
devel | ubuntu:devel | Ubuntu's development base; today the same as 26.10 |
devel follows ubuntu:devel. Right now that is 26.10; after 26.10 ships it
moves to the next development release once Ubuntu opens it.
docker pull peculiarengineer/ubuntu-dev:26.04
ubuntu:26.04 by default — one Dockerfile builds every tag above
via --build-arg UBUNTU_VERSION=<version>vscode (UID/GID 1000) with passwordless sudotini as PID 1 (clean signal handling)en_US.UTF-8build-essential, pkg-config, git, curl/wget, ripgrep
(rg), fd, jq, vim/nano, zsh, bash-completion, htop, tree,
unzip/zip, openssh-client, man, lsb-releaseAnything language-specific (Node, Python, Go, Docker-in-Docker, gh) is left to
Dev Container Features so the base stays small — see .devcontainer/devcontainer.json.
Open the folder in VS Code → Reopen in Container. The included
.devcontainer/devcontainer.json builds from the Dockerfile. To consume the
published image instead, replace the build block with:
"image": "peculiarengineer/ubuntu-dev:26.04"
# Build
docker build -t peculiarengineer/ubuntu-dev:26.04 .
# Build another base version (e.g. 26.10 or devel)
docker build --build-arg UBUNTU_VERSION=26.10 -t peculiarengineer/ubuntu-dev:26.10 .
# Interactive shell as the non-root user
docker run --rm -it peculiarengineer/ubuntu-dev:26.04
# Mount your project and work in it
docker run --rm -it -v "$PWD":/work -w /work peculiarengineer/ubuntu-dev:26.04
docker buildx build --platform linux/amd64,linux/arm64 \
-t peculiarengineer/ubuntu-dev:26.04 --push .
The published images are rebuilt automatically by
.github/workflows/build.yml:
Dockerfile.26.04, 26.10, devel) with --pull, so
each run re-fetches the ubuntu base, and an APT_REFRESH build argument
that changes every run (and every re-run attempt) makes the package layer reinstall the current apt
packages instead of reusing the build cache.tests/smoke.sh) on an amd64 build before
pushing, so a base that fails it is not published (arm64 is built but not
run). Tags pushed: :26.04 + :latest, :26.10, and
:devel.keepalive job re-enables the workflow through the GitHub API on every
scheduled run — GitHub disables scheduled workflows after 60 days without
repository activity, which is how the rebuilds silently stopped before.Requires two repository secrets: DOCKERHUB_USERNAME and DOCKERHUB_TOKEN
(a Docker Hub access token with
read/write scope). You can also trigger a rebuild manually from the Actions
tab (Run workflow).
--build-arg USERNAME=dev --build-arg USER_UID=1001features in devcontainer.json over editing the Dockerfile.MIT — see LICENSE.
Content type
Image
Digest
sha256:f7c75eea8…
Size
215.6 MB
Last updated
2 days ago
docker pull peculiarengineer/ubuntu-dev