Especificación para definir entornos de desarrollo reproducibles en contenedores, eliminando el problema de 'funciona en mi máquina' y acelerando el onboarding.
Dev Containers es una especificación abierta para definir entornos de desarrollo completos en contenedores Docker. Un archivo devcontainer.json describe todo lo necesario: imagen base, herramientas, extensiones de editor, variables de entorno y configuración de red. Cualquier desarrollador puede abrir el proyecto y obtener un entorno idéntico en minutos, sin instalar dependencias localmente.
La especificación va más allá de un simple Dockerfile. Define cómo el editor debe comportarse dentro del contenedor, qué puertos exponer, cómo manejar el código fuente y qué comandos ejecutar después de crear el contenedor. Es infraestructura como código aplicada al entorno de desarrollo.
Los devcontainers eliminan la fricción del onboarding y garantizan que todos los desarrolladores trabajen con las mismas versiones de herramientas, reduciendo los bugs relacionados con diferencias de entorno y mejorando la experiencia del desarrollador.
Un devcontainer.json real para un proyecto Node.js con base de datos:
{
"name": "Full Stack App",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"features": {
"ghcr.io/devcontainers/features/aws-cli:1": {
"version": "latest"
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"version": "latest",
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.vscode-typescript-next",
"bradlc.vscode-tailwindcss",
"ms-vscode.vscode-json",
"esbenp.prettier-vscode"
],
"settings": {
"typescript.preferences.importModuleSpecifier": "relative",
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
},
"forwardPorts": [3000, 5432],
"portsAttributes": {
"3000": {
"label": "Application",
"onAutoForward": "notify"
}
},
"postCreateCommand": "npm install && npm run db:migrate",
"postStartCommand": "npm run dev",
"remoteUser": "node",
"mounts": [
"source=${localWorkspaceFolder}/.aws,target=/home/node/.aws,type=bind,consistency=cached"
]
}Para aplicaciones con múltiples servicios, usar Docker Compose:
# docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: .devcontainer/Dockerfile
volumes:
- ../..:/workspaces:cached
command: sleep infinity
environment:
- DATABASE_URL=postgresql://postgres:postgres@db:5432/myapp
depends_on:
- db
- redis
db:
image: postgres:15
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: myapp
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
postgres-data:Para desarrollo con IA o machine learning:
{
"name": "ML Development",
"image": "mcr.microsoft.com/devcontainers/python:3.11",
"features": {
"ghcr.io/devcontainers/features/nvidia-cuda:1": {
"installCudnn": true
}
},
"runArgs": ["--gpus", "all"],
"postCreateCommand": "pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118"
}Los devcontainers pueden ejecutarse en CI/CD para garantizar paridad entre desarrollo y testing:
# .github/workflows/test.yml
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: devcontainers/ci@v0.3
with:
runCmd: npm test| Herramienta | Soporte | Características | Limitaciones |
|---|---|---|---|
| VS Code | Nativo | Extensiones, debugging, terminal integrado | Solo VS Code |
| GitHub Codespaces | Nativo | Cloud, colaboración, prebuilds | Requiere GitHub |
| JetBrains Gateway | Parcial | IDEs completos, debugging remoto | Configuración compleja |
| DevPod | Nativo | Open source, múltiples providers | Comunidad pequeña |
El ecosistema de features permite agregar herramientas sin modificar la imagen base:
Cada feature es versionado independientemente y puede configurarse con opciones específicas.
Los devcontainers resuelven uno de los problemas más costosos en ingeniería: la inconsistencia de entornos. Un desarrollador senior puede perder días configurando un proyecto complejo, y los bugs por diferencias de entorno consumen tiempo de debugging valioso.
Al definir el entorno como código, los devcontainers garantizan reproducibilidad y reducen el tiempo de onboarding de días a minutos. Esto es especialmente crítico en equipos distribuidos donde cada desarrollador tiene un setup diferente. La inversión inicial en configurar devcontainers se amortiza rápidamente con la reducción de fricción y bugs relacionados con el entorno.
Plataforma de contenedores que empaqueta aplicaciones con todas sus dependencias en unidades portables y consistentes que se ejecutan igual en cualquier entorno.
Disciplina enfocada en optimizar la productividad, satisfacción y efectividad de los desarrolladores mediante herramientas, procesos y entornos bien diseñados.
Continuous Integration y Continuous Delivery/Deployment — prácticas que automatizan la integración de código, testing y entrega a producción. Fundamento de la ingeniería de software moderna.
Entorno de desarrollo personal con devcontainer, Docker Compose, backend Python y frontend React.
Plantilla de devcontainer para desarrollo fullstack serverless con backend Python, frontend React y servicios AWS locales.
Plantilla mínima de devcontainer para iniciar proyectos rápidamente con una configuración base limpia.
Colección de features personalizados para Dev Containers con testing automatizado, CI/CD y publicación en GitHub Container Registry.
Plantilla de devcontainer basada en Amazon Linux para entornos de desarrollo compatibles con AWS.
Prácticas y herramientas para crear entornos de desarrollo productivos en la máquina del desarrollador, replicando producción lo más fielmente posible.