Node.js
Node.js tiene imagen oficial node. Esta página usa node:26-alpine: nombre
node, versión mayor 26, variante base alpine.
Qué aprenderás
Sección titulada «Qué aprenderás»- Cómo leer
node:26-alpiney por quénode:alpine-26no existe. - Cuándo Alpine ayuda y cuándo complica (dependencias nativas, libc, tooling).
- Cómo aplicar privilegio mínimo con
USER node. - Por qué
CMD ["node", "server.js"]en forma exec es preferible.
La etiqueta, parte por parte
Sección titulada «La etiqueta, parte por parte»node es el nombre oficial. 26 selecciona la versión mayor. alpine es la
variante de base mínima. No afirmes que Alpine es automáticamente mejor:
dependencias nativas, compatibilidad libc, herramientas de compilación y
arquitectura pueden hacer preferible otra variante.
Dockerfile con caché y sin root
Sección titulada «Dockerfile con caché y sin root»FROM node:26-alpineWORKDIR /app
COPY package.json pnpm-lock.yaml ./RUN corepack enable && pnpm install --frozen-lockfile
COPY . .RUN chown -R node:node /appUSER nodeCMD ["node", "server.js"]Los manifiestos se copian antes que el código para conservar la caché. chown
deja los archivos en manos del usuario node y USER node ejecuta la app sin
root: un proceso de aplicación normalmente no necesita ser root.
La forma exec ["node", "server.js"] ejecuta el proceso directamente, sin shell
intermedia: señales y stop llegan al proceso correcto.
Build y ejecución
Sección titulada «Build y ejecución»docker build -t my-node-app:1.0 .docker run -d --name my-node-app -p 3000:3000 my-node-app:1.0La etapa de build puede necesitar devDependencies; la imagen final de runtime
debe contener solo lo necesario para ejecutar. No uses --prod a ciegas en una
etapa que todavía compila.
Error común
Sección titulada «Error común»Copiar node_modules del host dentro de la imagen Linux. Los binarios nativos
del host (otro SO, otra arquitectura) fallan dentro del contenedor. Deja que la
imagen instale sus propias dependencias con el lockfile.
Siguiente paso
Sección titulada «Siguiente paso»Continúa con Laravel para ver por qué PHP no tiene un
equivalente directo de node:26-alpine y cómo razonar su base.