# =========================================== # DOCKERFILE PARA APLICACIÓN FRONTEND NODE.JS # =========================================== # Usamos una imagen base ligera de Node.js 18 basada en Alpine Linux # Alpine es una distribución Linux muy pequeña (~5MB) que reduce el tamaño de la imagen # node:18-alpine incluye Node.js 18 y npm, las herramientas necesarias para aplicaciones JavaScript FROM node:18-alpine # Establecemos el directorio de trabajo dentro del contenedor # Todas las operaciones posteriores (COPY, RUN, CMD) se ejecutarán desde este directorio # /usr/src/app es una convención común para aplicaciones en contenedores WORKDIR /usr/src/app # Copiamos SOLO los archivos package.json y package-lock.json (si existe) # El patrón package*.json copia ambos archivos: package.json y package-lock.json # Esto se hace ANTES de copiar el resto del código para aprovechar la caché de Docker # Si solo cambia el código fuente (no las dependencias), Docker reutiliza la capa de npm install COPY package*.json ./ # Instalamos las dependencias de Node.js definidas en package.json # npm install lee package.json y descarga todas las dependencias listadas # Se ejecuta en esta capa para que Docker pueda cachear el resultado # Si las dependencias no cambian, esta capa se reutiliza en builds posteriores RUN npm install # Copiamos TODO el resto del código de la aplicación al contenedor # El primer punto (.) representa el directorio actual del host (donde está el Dockerfile) # El segundo punto (.) representa el directorio de trabajo del contenedor (/usr/src/app) # Esto incluye index.js, archivos estáticos, etc. (excluyendo lo que esté en .dockerignore) COPY . . # Exponemos el puerto 3000 que usará la aplicación web # Esta instrucción es solo documentativa - no abre el puerto automáticamente # El puerto se abre realmente cuando se ejecuta el contenedor con -p o en docker-compose # Es una buena práctica documentar qué puertos usa la aplicación EXPOSE 3000 # Comando por defecto para iniciar la aplicación cuando se ejecute el contenedor # Se ejecuta automáticamente cuando se inicia el contenedor (a menos que se sobrescriba) # Formato de array: ["comando", "argumento1", "argumento2"] # node index.js ejecutará el archivo index.js con el runtime de Node.js CMD ["node", "index.js"]