Saltar a contenido

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.

|__src
Dockerfile
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

  1. Base de la Imagen

  2. Se utiliza la imagen node:21-alpine3.18 para una base ligera de Node.js en Alpine Linux.

  3. Configuración del Entorno de Trabajo

  4. El directorio de trabajo se establece en /app.

  5. Configuración de pnpm

  6. Habilita corepack para manejar pnpm, asegurando la activación de la última versión de pnpm.

  7. Instalación de Dependencias y Herramientas

  8. Se instalan herramientas como python3, make, y g++ para permitir la instalación de paquetes nativos de Node.js.

  9. git también se agrega para gestionar dependencias basadas en repositorios.
  10. Copia de Archivos

  11. Los archivos de código y los archivos de dependencias (package*.json y *-lock.yaml) se copian al contenedor.

  12. Instalación de Dependencias y Construcción

  13. pnpm install instala las dependencias necesarias y pnpm run build compila el proyecto.

  14. Una vez construido, las herramientas nativas (.gyp) se eliminan para reducir el tamaño de la imagen.

Etapa 2: production

  1. Base de la Imagen

  2. Usa node:21-alpine3.18 nuevamente como base para el entorno de producción.

  3. Configuración del Entorno de Trabajo

  4. El directorio de trabajo permanece en /app.

  5. Copia de Archivos del Entorno de dist

  6. Solo el directorio dist y los archivos de dependencias generados en la primera etapa se copian para mantener la imagen ligera.

  7. Configuración de pnpm y Dependencias de Producción

  8. pnpm se vuelve a habilitar y se instala exclusivamente con las dependencias de producción.

  9. Optimización de la Imagen

  10. Limpieza del caché de npm y eliminación de archivos no necesarios de pnpm.

  11. Se crea un nuevo usuario nodejs con ID de usuario y grupo 1001 para mayor seguridad en la ejecución de la aplicación.
  12. Comando de Inicio

  13. El contenedor ejecuta npm start como comando predeterminado, iniciando la aplicación.