Sign inSign up

lucasvmigotto/devenv

By lucasvmigotto

•Updated 5 days ago

Development environments inspired by devcontainer

Image
Languages & frameworks
Developer tools
Operating systems
0

10K+

lucasvmigotto/devenv repository overview

⁠devenv - v1.2.0

Reproducible, non-root DevContainer⁠ images for Debian, Ubuntu, Alpine, and Arch Linux.

Docker Pulls GitHub stars

⁠Features

  • Non-root by default — a developer user (UID 1000) with passwordless sudo or doas.
  • ZSH + Spaceship prompt and Nerd Fonts (FiraCode, FiraMono, NerdFontsSymbolsOnly), driven by the dottod⁠ dotfiles.
  • Persistent caches — every language image declares VOLUMEs for its dependency caches, mapped under /home/developer, so caches survive container rebuilds.
  • 28 languages across 4 distros, built and pushed with multi-arch Buildx, type=gha layer caching, and SLSA provenance.
  • Flutter with Android SDK — Flutter images bundle a JDK and the Android SDK (commandline-tools, platforms, build-tools), pre-cached engine artifacts, and VOLUMEs for .pub-cache, .gradle, and .android.

⁠Documentation

Full documentation — architecture, image catalog, usage, and development guides: https://devenv.lucasvmigotto.me⁠

⁠Tags

⁠Base images

Tag pattern: {distro}-{version} (sudo by default; append -doas). latest is an alias for debian-trixie.

DistroTags
debiantrixie, bookworm
ubuntunoble, jammy
alpine3.23, 3.22, 3.21
archlinuxbase, base-devel, multilib-devel

Examples: debian-trixie, debian-trixie-doas, ubuntu-noble, alpine-3.23, archlinux-base.

⁠Language images

Tag pattern: {lang}-{version}-{distro} (e.g. go-1.26-debian, python-3.14-alpine).

ImageVersionsDistrosNotes
assemblylatestdebian, ubuntu, alpine, archlinuxstateless toolchain, no cache
bun1.3.9debian, ubuntu, alpine, archlinux
clatestdebian, ubuntu, alpine, archlinux
clojure1.12.4debian, ubuntu, archlinux
cobol3.2debian, ubuntu, alpine
cpplatestdebian, ubuntu, alpine, archlinux
delphi3.2.2debian, ubuntu, archlinuxFree Pascal, Delphi mode
dotnet10.0, 9.0debian, ubuntuglibc-only
elixir1.19debian, ubuntuglibc-only
flutter3.47.0debian, ubuntuAndroid SDK; JDK 25 default, -jdk21 variant
go1.26, 1.25debian, ubuntu, alpine, archlinux
haskell9.12debian, ubuntuglibc-only
java25, 21debian, ubuntu, archlinux
julia1.12, 1.10debian, ubuntu, archlinux
lua5.4debian, ubuntu, alpine, archlinux
node24.20.0, 22.23.2debian, ubuntu, archlinuxyarn (Berry) default, -npm / -pnpm variants
perl5.40debian, ubuntu, alpine, archlinux
php8.4, 8.3debian, ubuntu, archlinux
python3.14, 3.13, 3.12debian, ubuntu, alpine, archlinuxuv-managed
r4.4debian, ubuntu, alpine, archlinux
ruby3.4, 3.3debian, ubuntu, archlinux
rust1.89debian, ubuntu, alpine, archlinux
scala3.7.4, 2.13.18debian, ubuntu, archlinuxJDK 21, via Coursier
smalltalk130, 120debian, ubuntuPharo; glibc-only
zig0.15.2debian, ubuntu, alpine, archlinux
basic2.90debian, ubuntu, alpineYabasic interpreter
adalatestdebian, ubuntuGNAT (distro default version)
lisp2.4debian, ubuntu, alpine, archlinuxSBCL + Quicklisp

Example variant tags: node-24.20.0-npm-debian, flutter-3.47.0-jdk21-ubuntu.

Upstream glibc-linked toolchains are why some images skip Alpine (musl); see the manifest⁠ as the single source of truth for the full tag matrix.

⁠Quick start

# base image (interactive zsh)
docker run -it --rm lucasvmigotto/devenv:latest

# a language image
docker run -it --rm lucasvmigotto/devenv:go-1.26-debian
⁠Persistent caches

Declared VOLUMEs are anonymous by default; use named volumes to persist them across runs:

docker run -it --rm \
  -v rust-cargo:/home/developer/.cargo \
  lucasvmigotto/devenv:rust-1.89-debian

⁠DevContainer usage

.devcontainer/devcontainer.json:

{
  "image": "lucasvmigotto/devenv:go-1.26-debian",
  "remoteUser": "developer"
}

docker-compose.yml:

services:
  dev:
    image: lucasvmigotto/devenv:rust-1.89-debian
    user: developer
    volumes:
      - rust-cargo:/home/developer/.cargo
      - ./:/workspace
    working_dir: /workspace

volumes:
  rust-cargo:

⁠Languages & cache volumes

Every language image declares VOLUMEs (owned by developer, under $HOME) for its dependency caches:

LanguageCache volumes (under $HOME)
java.gradle, .m2/repository
gogo/pkg, go/bin
rust.cargo/registry, .cargo/git, .cargo/bin
python.venv, .cache/uv, .local/share/uv/python
dotnet.nuget/packages
flutter.pub-cache, .gradle, .android
bun.bun
zig.cache/zig
c / cpp.cache/ccache
clojure.m2/repository
lua.luarocks
elixir.mix, .hex
haskell.ghcup, .stack, .cabal
node.npm, .yarn, .local/share/pnpm
assembly(none — stateless toolchain)
cobol(none — stateless toolchain)
julia.julia
scala.cache/coursier, .sbt, .ivy2
delphi (fpc).fppkg
perlperl5, .cpan
php.composer
r.R/library, .cache/R
ruby.gem, .bundle
smalltalk (pharo).cache/pharo
basic (yabasic)(none — stateless interpreter)
ada (gnat).cache/ccache
lisp (sbcl)quicklisp, .cache/common-lisp

Substitutions: delphi is Free Pascal in Delphi-compatibility mode (Embarcadero Delphi has no headless Linux distribution); smalltalk is Pharo (GNU Smalltalk is unmaintained and absent from Debian/Ubuntu).

⁠Privilege escalation

The non-root developer user has passwordless escalation. Base images default to sudo; append -doas to the tag for doas:

docker run -it --rm lucasvmigotto/devenv:debian-trixie-doas

⁠Build from source

The base image is a single parametrized Dockerfile:

docker build -f .docker/base.Dockerfile \
    --build-arg _BASE_IMAGE=debian:trixie-slim \
    --build-arg _DISTRO=debian \
    --build-arg _PRIV_TOOL=sudo \
    -t devenv:debian-trixie .

Source and build matrix: https://github.com/lucasvmigotto/devenv/tree/1.2.0⁠.

Tag summary

Content type

Image

Digest

sha256:86e7bb84d…

Size

257.3 MB

Last updated

5 days ago

docker pull lucasvmigotto/devenv:lisp-2.4-archlinux