El Problema
Los dev containers de VS Code son la forma más limpia de dar a cada colaborador de un proyecto un entorno idéntico: el mismo sistema operativo, las mismas versiones de herramientas, el mismo shell. Pero esa consistencia tiene un costo: la primera vez que alguien abre el proyecto, VS Code tiene que compilar la imagen del contenedor desde cero. Instalar una capa base del sistema operativo, un runtime de lenguaje, un shell y cualquier herramienta de IA encima puede tardar varios minutos, y eso vuelve a ocurrir con cada cambio en el Dockerfile que invalide la caché.
Para los equipos que además dependen de Claude Code dentro del contenedor, hay una segunda capa de fricción: lograr que la autenticación, el historial del shell y las cachés de npm sobrevivan a una reconstrucción del contenedor requiere el mismo devcontainer.json repetitivo en cada repositorio.
Cómo lo Resuelve
nerdy-pro-dev-container es una imagen Docker preconfigurada y multiarquitectura, publicada en GitHub Container Registry. En lugar de compilar una imagen de dev container por proyecto, un repositorio apunta su devcontainer.json a la imagen publicada y VS Code la descarga directamente — sin paso de compilación, sin espera.
La imagen incluye todo lo necesario para empezar a trabajar de inmediato en un proyecto basado en Node.js:
- Ubuntu 26.04 como imagen base (la imagen oficial
devcontainers/basede Microsoft) - Node.js LTS, instalado a través de NodeSource
- Claude Code, instalado globalmente vía npm
- zsh con oh-my-zsh, configurado con los plugins
gityfzfcomo shell de inicio de sesión predeterminado - Herramientas CLI comunes — git, curl, wget, jq, gpg, cliente OpenSSH, fzf
- sudo sin contraseña para el usuario
vscode
Está compilada tanto para linux/amd64 como para linux/arm64, así que la misma etiqueta funciona en máquinas Intel/AMD y en Apple Silicon.

Persistencia Entre Reconstrucciones
Un contenedor que se reconstruye con cada cambio en el Dockerfile solo es conveniente si el estado no se reinicia junto con él. La plantilla configura cuatro volúmenes Docker con nombre para que nada se pierda entre reconstrucciones:
- Configuración y datos de sesión de Claude Code (directorio
.claude, víaCLAUDE_CONFIG_DIR) - Historial de comandos de zsh (
HISTFILEen un volumen persistente) - Caché de paquetes npm
known_hostsde SSH, para que la confianza con los hosts de git no deba restablecerse cada vez
La autenticación de git reenvía el agente SSH del host hacia el contenedor, y el gitconfig del host se propaga automáticamente — los commits realizados dentro del contenedor llevan la identidad de autor correcta sin ninguna configuración manual.
Primeros Pasos
Copie la plantilla en .devcontainer/devcontainer.json:
{
"name": "my-project",
"image": "ghcr.io/nerdy-pro/nerdy-pro-dev-container:latest"
}
Vuelva a abrir el proyecto en un dev container, y Node.js, zsh y Claude Code estarán listos sin ningún paso de compilación.
Autenticación de Claude Code
Claude Code dentro del contenedor lee una variable de entorno CLAUDE_CODE_OAUTH_TOKEN en lugar de pasar por un inicio de sesión interactivo. Genere un token de larga duración en el host con:
claude setup-token
Guárdelo en el gestor de credenciales del host — Keychain en macOS, el keyring de escritorio (secret-tool) en Linux, o DPAPI en Windows — y reenvíelo al contenedor con una entrada remoteEnv en devcontainer.json, de modo que nunca haya que escribirlo dentro del propio contenedor.
Primera operación de git
El primer push o fetch en un contenedor recién creado solicita verificación de la clave del host en la terminal — una confirmación única que establece la confianza SSH para ese host de git, la cual queda luego en caché en el volumen persistente known_hosts.
Versionado y Lanzamientos
Las imágenes se compilan y publican únicamente a partir de los releases de GitHub, no en cada commit — un cambio en el Dockerfile en main no afecta a nadie hasta que se publica un release. Cada release publica cuatro etiquetas:
| Etiqueta | Comportamiento |
|---|---|
1.0.0 | Fija — nunca cambia |
1.0 | Se actualiza en releases de parche |
1 | Se actualiza en releases menores y de parche |
latest | Siempre el release estable más reciente |
Ese rango permite que un proyecto se fije a una versión exacta para reproducibilidad, o siga latest para mantenerse actualizado automáticamente.
Licencia
El Dockerfile, la plantilla devcontainer.json y la documentación tienen licencia MIT. Todo lo instalado sobre la imagen base — Ubuntu, Node.js, zsh, fzf, Claude Code — conserva su propia licencia original.
Ejecute claude setup-token en el host para generar un token de larga duración, guárdelo en el gestor de credenciales del host y reenvíelo al contenedor como la variable de entorno CLAUDE_CODE_OAUTH_TOKEN mediante remoteEnv en devcontainer.json.