Alejandría

Busca en Alejandría

Herramientas

Dev Containers

Especificación para definir entornos de desarrollo reproducibles dentro de contenedores.

01

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.

02

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 up y devcontainer exec para 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.