En pocas palabras
Especificación para definir entornos de desarrollo reproducibles dentro de contenedores.
Qué problema resuelve
Diferencias de herramientas y dependencias entre estaciones de trabajo y onboarding repetitivo.
Cuándo utilizarlo
Equipos y agentes de programación. Ejemplo: abrir el proyecto con la misma toolchain y utilidades.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
En el Radar compartido: Trial (valoración de la edición aportada).
Cómo funciona
Un devcontainer.json describe imagen o build, configuración y tareas de preparación. Clientes compatibles crean o reutilizan el contenedor; reconstruirlo aplica cambios de entorno.
Ejemplo de uso
Definir una imagen con Node y herramientas del proyecto, montar solo el workspace y ejecutar la instalación reproducible. Evitar montar el socket de Docker o carpetas personales si el objetivo es aislamiento.
Un .devcontainer/devcontainer.json mínimo define la base del entorno:
{
"name": "Entorno de desarrollo",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu"
}
Añadir la toolchain del proyecto y fijar la imagen por versión o digest para mayor reproducibilidad.
Ejemplo completo
{
"name": "api-solicitudes",
"image": "mcr.microsoft.com/devcontainers/java:1-21-bookworm",
"features": {
"ghcr.io/devcontainers/features/node:1": { "version": "22" },
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"forwardPorts": [8080, 5432],
"postCreateCommand": "./mvnw -q dependency:go-offline",
"customizations": {
"vscode": {
"extensions": ["vscjava.vscode-java-pack", "redhat.vscode-yaml"],
"settings": { "java.compile.nullAnalysis.mode": "automatic" }
}
},
"remoteUser": "vscode",
"containerEnv": { "SPRING_PROFILES_ACTIVE": "local" }
}
Varios servicios con Docker Compose
{
"name": "originacion",
"dockerComposeFile": ["../docker-compose.yml", "docker-compose.dev.yml"],
"service": "app",
"workspaceFolder": "/workspaces/originacion",
"shutdownAction": "stopCompose"
}
El servicio app es el contenedor de desarrollo; PostgreSQL, Kafka o un mock del buró arrancan como servicios hermanos en la misma red.
Ciclo de vida
| Hook | Cuándo se ejecuta |
|---|---|
initializeCommand |
En el host, antes de crear el contenedor |
onCreateCommand |
Una vez al crear el contenedor |
postCreateCommand |
Tras crear y asignar al usuario (instalar dependencias) |
postStartCommand |
Cada vez que el contenedor arranca |
postAttachCommand |
Cada vez que el editor se conecta |
Dónde se usan
- VS Code (extensión Dev Containers) y JetBrains (Gateway / IDEs).
- GitHub Codespaces y otros entornos en la nube basados en la especificación.
- CLI
devcontainer:devcontainer upydevcontainer execpara usar el mismo entorno en CI o con agentes de código.
Esto último encaja con sandboxed execution for coding agents: el agente trabaja dentro del contenedor, con acceso limitado al host.
Acelerar el arranque
Construye una imagen preconstruida con las Features y dependencias (devcontainer build --push) y referencia esa imagen. Reduce el arranque de minutos a segundos, especialmente en Codespaces.
Criterios de implementación
Fijar versiones y revisar Features, scripts, montajes y credenciales reenviadas. La persistencia y los controles de red requieren decisiones explícitas; comparte kernel con el host.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.