Het probleem
Dev containers in VS Code zijn de nette manier om elke bijdrager aan een project een identieke omgeving te geven — hetzelfde OS, dezelfde toolversies, dezelfde shell. Maar die gelijkheid heeft een prijs: de eerste keer dat iemand het project opent, moet VS Code het container-image vanaf nul bouwen. Een OS-basislaag, een taalruntime, een shell en eventuele AI-tooling erbovenop installeren kost al gauw enkele minuten, en het gebeurt opnieuw bij elke wijziging in de Dockerfile die de cache ongeldig maakt.
Voor teams die binnen de container ook op Claude Code leunen, komt daar een tweede laag wrijving bij: authenticatie, shellgeschiedenis en npm-caches een herbouw laten overleven vraagt in elke repository om dezelfde standaard devcontainer.json.
Hoe het dat oplost
nerdy-pro-dev-container is een kant-en-klaar multi-architectuur-Docker-image, gepubliceerd naar de GitHub Container Registry. In plaats van per project een dev-container-image te bouwen, wijst een repository haar devcontainer.json naar het gepubliceerde image en haalt VS Code het rechtstreeks op — geen buildstap, geen wachten.
Het image bundelt alles wat een project op basis van Node.js nodig heeft om meteen aan de slag te gaan:
- Ubuntu 26.04 als basis (het officiële
devcontainers/base-image van Microsoft) - Node.js LTS, geïnstalleerd via NodeSource
- Claude Code, globaal geïnstalleerd via npm
- zsh met oh-my-zsh, ingesteld met de plug-ins
gitenfzfals standaard loginshell - Gangbare CLI-tools — git, curl, wget, jq, gpg, OpenSSH-client, fzf
- sudo zonder wachtwoord voor de gebruiker
vscode
Het is gebouwd voor zowel linux/amd64 als linux/arm64, dus dezelfde tag werkt op Intel- en AMD-machines én op Apple Silicon.

Behoud bij herbouw
Een container die bij elke wijziging in de Dockerfile opnieuw wordt gebouwd, is alleen handig als de staat niet meeverdwijnt. Het sjabloon koppelt vier benoemde Docker-volumes, zodat er tussen herbouwen niets verloren gaat:
- Configuratie en sessiegegevens van Claude Code (de map
.claude, viaCLAUDE_CONFIG_DIR) - Commandogeschiedenis van zsh (
HISTFILEop een blijvend volume) - Cache met npm-pakketten
- SSH-
known_hosts, zodat vertrouwen in een git-host niet elke keer opnieuw hoeft te worden gevestigd
Git-authenticatie stuurt de SSH-agent van de host door naar de container, en de gitconfig van de host wordt automatisch overgenomen — commits die binnen de container worden gemaakt dragen zonder handwerk de juiste auteursidentiteit.
Aan de slag
Kopieer het sjabloon naar .devcontainer/devcontainer.json:
{
"name": "my-project",
"image": "ghcr.io/nerdy-pro/nerdy-pro-dev-container:latest"
}
Open het project opnieuw in een dev container, en Node.js, zsh en Claude Code staan klaar zonder buildstap.
Claude Code authenticeren
Claude Code leest binnen de container een omgevingsvariabele CLAUDE_CODE_OAUTH_TOKEN in plaats van een interactieve login te doorlopen. Genereer op de host een langlevend token met:
claude setup-token
Bewaar het in het wachtwoordbeheer van de host — Keychain op macOS, de desktop-keyring (secret-tool) op Linux, of DPAPI op Windows — en stuur het via een remoteEnv-regel in devcontainer.json door naar de container, zodat het nooit binnen de container zelf getypt hoeft te worden.
De eerste git-handeling
De eerste push of fetch in een verse container vraagt in de terminal om verificatie van de hostsleutel — een eenmalige bevestiging die het SSH-vertrouwen voor die git-host vestigt, waarna het in het blijvende known_hosts-volume wordt bewaard.
Versies en releases
Images worden alleen gebouwd en gepubliceerd vanuit GitHub-releases, niet vanuit elke commit — een wijziging in de Dockerfile op main raakt niemand tot er een release wordt uitgebracht. Elke release publiceert vier tags:
| Tag | Gedrag |
|---|---|
1.0.0 | Vastgezet — verandert nooit |
1.0 | Werkt bij op patchreleases |
1 | Werkt bij op minor- en patchreleases |
latest | Altijd de nieuwste stabiele release |
Met die reeks kan een project op een exacte versie vastzetten voor reproduceerbaarheid, of latest volgen om automatisch bij te blijven.
Licentie
De Dockerfile, het devcontainer.json-sjabloon en de documentatie vallen onder de MIT-licentie. Alles wat boven op het basisimage is geïnstalleerd — Ubuntu, Node.js, zsh, fzf, Claude Code — houdt zijn eigen oorspronkelijke licentie.
Draai claude setup-token op de host om een langlevend token te genereren, bewaar het in het wachtwoordbeheer van de host, en stuur het via remoteEnv in devcontainer.json door naar de container als omgevingsvariabele CLAUDE_CODE_OAUTH_TOKEN.