# ───────────────────────────────────────────────────────────── # Etapa 1: Build – compilamos la app en archivos estáticos # ───────────────────────────────────────────────────────────── FROM node:20.20.0-alpine AS builder # libc6-compat puede ser necesario para algunas dependencias nativas en alpine RUN apk add --no-cache libc6-compat WORKDIR /app # Instalamos dependencias primero (aprovechar cache de Docker si no cambia package.json) COPY package.json yarn.lock* ./ RUN yarn install --frozen-lockfile # Copiamos el resto del código COPY . . # Deshabilitar telemetría de Next.js ENV NEXT_TELEMETRY_DISABLED=1 # Generar la exportación estática → carpeta /app/out RUN yarn build # ───────────────────────────────────────────────────────────── # Etapa 2: Runtime – Nginx sirve los archivos estáticos # La imagen final no tiene Node.js, sólo Nginx (~20 MB) # ───────────────────────────────────────────────────────────── FROM nginx:1.27-alpine AS runner # Eliminar la config por defecto de Nginx RUN rm -rf /etc/nginx/conf.d/default.conf # Preparar directorios de cache y pid para correr como non-root (user 1001:1001) RUN mkdir -p /var/cache/nginx/client_temp \ /var/cache/nginx/proxy_temp \ /var/cache/nginx/fastcgi_temp \ /var/cache/nginx/uwsgi_temp \ /var/cache/nginx/scgi_temp \ /tmp/nginx \ && chmod -R 777 /var/cache/nginx /tmp/nginx # Copiar nuestra configuración personalizada COPY nginx.conf /etc/nginx/conf.d/default.conf # Copiar los archivos estáticos generados por Next.js COPY --from=builder /app/out /usr/share/nginx/html # Borrar la directiva pid original para evitar conflictos con la que le pasamos por línea de comandos RUN sed -i '/^pid/d' /etc/nginx/nginx.conf EXPOSE 3000 CMD ["nginx", "-g", "daemon off; pid /tmp/nginx/nginx.pid;"]