Dockerfile para Aplicación Node.js
Este Dockerfile crea una imagen de Docker optimizada para una aplicación Node.js usando pnpm como gestor de dependencias. Utiliza una estructura multietapa para separar la construcción y la ejecución en entornos de dist y production, respectivamente.
FROM node:21-alpine3.18 as dist
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@latest --activate
ENV PNPM_HOME=/usr/local/bin
COPY . .
COPY package*.json *-lock.yaml ./
RUN apk add --no-cache --virtual .gyp \
python3 \
make \
g++ \
&& apk add --no-cache git \
&& pnpm install && pnpm run build \
&& apk del .gyp
#----
FROM node:21-alpine3.18 as production
WORKDIR /app
COPY --from=dist /app/dist ./dist
COPY --from=dist /app/*.json /app/*-lock.yaml ./
RUN corepack enable && corepack prepare pnpm@latest --activate
ENV PNPM_HOME=/usr/local/bin
RUN npm cache clean --force && pnpm install --production --ignore-scripts \
&& addgroup -g 1001 -S nodejs && adduser -S -u 1001 nodejs \
&& rm -rf $PNPM_HOME/.npm $PNPM_HOME/.node-gyp
CMD ["npm", "start"]
Etapa 1: Construcción (dist)
FROM node:21-alpine3.18 as dist
Define el directorio de trabajo dentro del contenedor
WORKDIR /app
Habilita Corepack para gestionar pnpm e instala la última versión
RUN corepack enable && corepack prepare pnpm@latest --activate
Establece la variable de entorno para pnpm
ENV PNPM_HOME=/usr/local/bin
Copia todo el código fuente de la aplicación al contenedor
COPY . .
Copia archivos de dependencias (package.json y pnpm-lock.yaml)
COPY package.json -lock.yaml ./
Instala herramientas necesarias para dependencias con módulos nativos
RUN apk add --no-cache --virtual .gyp
python3
make
g++
# Agregagit para manejar dependencias git, instala las dependencias y construye el proyecto
&& apk add --no-cache git
&& pnpm install && pnpm run build
# Elimina herramientas nativas para reducir el tamaño de la imagen final
&& apk del .gyp
----
Etapa 2: Producción (production)
FROM node:21-alpine3.18 as production
Define el directorio de trabajo dentro del contenedor
WORKDIR /app
Copia el directorio de salida (dist) y archivos de dependencias desde dist
COPY --from=dist /app/dist ./dist COPY --from=dist /app/.json /app/-lock.yaml ./
Habilita pnpm en el entorno de producción y establece la variable de entorno
RUN corepack enable && corepack prepare pnpm@latest --activate ENV PNPM_HOME=/usr/local/bin
Limpia caché, instala dependencias de producción y elimina archivos innecesarios de pnpm
RUN npm cache clean --force && pnpm install --production --ignore-scripts
# Crea un usuario nodejs para ejecutar la app con permisos limitados
&& addgroup -g 1001 -S nodejs && adduser -S -u 1001 nodejs
&& rm -rf $PNPM_HOME/.npm $PNPM_HOME/.node-gyp
Establece el comando predeterminado para ejecutar la aplicación en producción
CMD ["npm", "start"]
Explicativo del proceso
Etapa 1: dist
-
Base de la Imagen
-
Se utiliza la imagen
node:21-alpine3.18para una base ligera de Node.js en Alpine Linux. -
Configuración del Entorno de Trabajo
-
El directorio de trabajo se establece en
/app. -
Configuración de
pnpm -
Habilita
corepackpara manejarpnpm, asegurando la activación de la última versión depnpm. -
Instalación de Dependencias y Herramientas
-
Se instalan herramientas como
python3,make, yg++para permitir la instalación de paquetes nativos de Node.js. gittambién se agrega para gestionar dependencias basadas en repositorios.-
Copia de Archivos
-
Los archivos de código y los archivos de dependencias (
package*.jsony*-lock.yaml) se copian al contenedor. -
Instalación de Dependencias y Construcción
-
pnpm installinstala las dependencias necesarias ypnpm run buildcompila el proyecto. - Una vez construido, las herramientas nativas (
.gyp) se eliminan para reducir el tamaño de la imagen.
Etapa 2: production
-
Base de la Imagen
-
Usa
node:21-alpine3.18nuevamente como base para el entorno de producción. -
Configuración del Entorno de Trabajo
-
El directorio de trabajo permanece en
/app. -
Copia de Archivos del Entorno de
dist -
Solo el directorio
disty los archivos de dependencias generados en la primera etapa se copian para mantener la imagen ligera. -
Configuración de
pnpmy Dependencias de Producción -
pnpmse vuelve a habilitar y se instala exclusivamente con las dependencias de producción. -
Optimización de la Imagen
-
Limpieza del caché de
npmy eliminación de archivos no necesarios depnpm. - Se crea un nuevo usuario
nodejscon ID de usuario y grupo1001para mayor seguridad en la ejecución de la aplicación. -
Comando de Inicio
-
El contenedor ejecuta
npm startcomo comando predeterminado, iniciando la aplicación.