Desarrollo17 de febrero de 2026

Cómo depurar Node.js en un contenedor Docker

Cada vez más equipos llevan sus entornos de desarrollo a contenedores Docker. Tiene muchas ventajas: un entorno unificado para todos los desarrolladores, una incorporación más rápida de las personas nuevas y despliegues predecibles. Por ejemplo, en el artículo “Microservicios vs. arquitectura monolítica” explicamos que con microservicios Docker es prácticamente obligatorio, porque si no tienes que lanzar varios microservicios en tu máquina local y el desarrollo se convierte en un suplicio. Con solo 5–10 microservicios ya tienes que arrancarlos uno a uno desde el terminal y asegurarte de tener instaladas todas las dependencias, la base de datos, elasticsearch, etc. La alternativa es levantarlo todo con un solo comando usando docker-compose, un enfoque mucho mejor.

Pero ese enfoque exige entender Docker y no perder las funcionalidades ni la experiencia que tenías sin él. Una de las cosas que hay que tener claras es cómo depurar dentro del contenedor Docker. En este artículo veremos varios casos de uso para depurar una app de Node.js en un contenedor docker.

Requisitos previos

  • VS Code
  • Docker
  • Extensión de Docker para VS Code

Casos

  • Node.js, Docker, sin Nodemon
  • Node.js, Docker, con Nodemon
  • Node.js, Docker con docker-compose

Node.js, Docker, sin Nodemon

Si ya tienes el Dockerfile de tu app de Node.js, probablemente se parezca a este:


FROM node:10-alpineEXPOSE 3000WORKDIR /usr/src/appCOPY package*.json ./
RUN npm installCOPY . .CMD [ "npm", "start" ]

Para seguir, tenemos que hacer el build del Dockerfile. Te recomendamos usar la extensión de Docker para VS Code y lanzar el build como se muestra a continuación:

Para activar el depurador en Node.js hay que usar — inspect o — inspect-brk, pero como la app se ejecutará dentro de Docker, también tenemos que permitir el acceso al depurador desde redes externas pasando 0.0.0.0.


"scripts": {
"start": "node --inspect=0.0.0.0 index.js"
},

Ahora, al ejecutar npm start, se lanzará el depurador de node en un puerto aparte (por defecto el 9229) al que podrás conectar tu herramienta de depuración. Para acceder al depurador, también tienes que exponer el puerto 9229 a tu máquina host. Puedes hacerlo con este comando:


docker run --rm -d -p 3000:3000 -p 9229:9229 -v ${PWD}:/usr/src/app -v /usr/src/app/node_modules example:latest

Con este comando exponemos a localhost los puertos 3000 y 9229 de la app dockerizada, montamos la carpeta actual con la app en /usr/src/app y usamos un pequeño truco para que Docker no sobrescriba los node modules con los de la máquina local.

Ahora podemos configurar la tarea de depuración con el asistente de VS Code. Pulsa CMD(Ctrl)+Shift+P (paleta de comandos) y busca “Debug: Open launch.json”:

Después elige Docker: Node.js:

Se generará un archivo launch.json con este contenido:


{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/usr/src/app",
"protocol": "inspector"
}
]
}

La configuración para Docker consiste en conectarse manualmente al puerto del depurador y mapear la carpeta raíz local con la remota para que los breakpoints sigan funcionando.

Ve a la vista de depuración de VS Code, pulsa el botón “Play” y a depurar en Docker.

Node.js, Docker, con Nodemon

Hay una pequeña diferencia cuando queremos usar el depurador con nodemon. Para empezar, el script de package.json quedará así:


"start": "nodemon --inspect=0.0.0.0 src/index.js",

Como nodemon reinicia la app con cada cambio, el depurador perderá la conexión. Para esos casos existe la opción “restart: true”, que hace que se intente reconectar al depurador después de cada reinicio.

Así que tu launch.json debería quedar así:


{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/usr/src/app",
"protocol": "inspector",
"restart": true
}
]
}

Ve a la vista de depuración de VS Code, pulsa el botón “Play” y, como antes, a depurar en Docker.

Node.js, Docker, con docker-compose

Una tercera opción es ejecutar tus imágenes Docker con docker-compose, algo muy práctico si tu servicio también necesita una base de datos u otras dependencias que puedas ejecutar con Docker.

Crea un docker-compose.yaml en la carpeta de tu app con este contenido:


version: '3'services:
example-service:
build: .
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
ports:
- 3000:3000
- 9229:9229
command: npm start

Básicamente hemos usado las mismas instrucciones que en la solución sin docker-compose, pero pasadas a formato yaml. Ahora puedes seguir con el archivo launch.json, con la opción de nodemon o la de node.js, y usar el depurador como se explica en las secciones anteriores.

Cuéntanos tu caso

Escríbenos