# ============================================================================ # 🐳 Task Manager Backend - Dockerfile # ============================================================================ # Build Multi-stage: # 1. Builder: Compila TypeScript → JavaScript # 2. Runner: Executa aplicação em produção # ============================================================================ # ============================================================================ # STAGE 1: BUILDER (Compilação) # ============================================================================ FROM node:20-alpine AS builder WORKDIR /app # Copiar package.json e package-lock.json COPY package*.json ./ # Instalar dependências (incluindo dev) RUN npm ci # Copiar código-fonte COPY . . # Compilar TypeScript RUN npm run build # ============================================================================ # STAGE 2: RUNNER (Produção) # ============================================================================ FROM node:20-alpine WORKDIR /app # 📝 Metadados da imagem LABEL maintainer="Erik Silva " LABEL version="1.0" LABEL description="Task Manager API - Backend NestJS com Supabase" # Definir NODE_ENV para produção ENV NODE_ENV=production # Copiar package.json (para saber quais dependências instalar) COPY package*.json ./ # Instalar apenas dependências de produção RUN npm ci --only=production && \ npm cache clean --force # Copiar código compilado do builder COPY --from=builder /app/dist ./dist # Criar usuário não-root para segurança RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 # Mudar propriedade dos arquivos RUN chown -R nodejs:nodejs /app # Mudar para usuário não-root USER nodejs # ============================================================================ # HEALTH CHECK # ============================================================================ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD node -e "require('http').get('http://localhost:3000/api', (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})" || exit 1 # ============================================================================ # PORTA E COMANDO # ============================================================================ EXPOSE 3000 CMD ["node", "dist/main.js"]