# ============================================================================= # GoHorse Backoffice - Ultra-Optimized Dockerfile # ============================================================================= FROM mirror.gcr.io/library/node:20-alpine AS base # Configurações básicas e pnpm com Mirror fix para evitar travamentos RUN sed -i 's/dl-cdn.alpinelinux.org/mirror.leaseweb.com/g' /etc/apk/repositories && \ apk add --no-cache libc6-compat RUN corepack enable && corepack prepare pnpm@latest --activate ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" # ----------------------------------------------------------------------------- # Stage 1: Dependencies # ----------------------------------------------------------------------------- FROM base AS deps WORKDIR /app # Copia apenas os arquivos de definição COPY package.json pnpm-lock.yaml ./ # Configura timeout e retry para o pnpm não travar em redes instáveis RUN pnpm config set fetch-retries 5 && \ pnpm config set fetch-retry-maxtimeout 600000 && \ pnpm install --frozen-lockfile # ----------------------------------------------------------------------------- # Stage 2: Builder # ----------------------------------------------------------------------------- FROM base AS builder WORKDIR /app ENV NODE_OPTIONS="--max-old-space-size=2048" # Copia os módulos instalados no estágio anterior COPY --from=deps /app/node_modules ./node_modules COPY . . # Build e limpeza de cache local do build RUN pnpm build && \ rm -rf node_modules/.cache # Remove dependências de desenvolvimento RUN pnpm prune --prod # ----------------------------------------------------------------------------- # Stage 3: Production (Imagem Final Leve) # ----------------------------------------------------------------------------- FROM mirror.gcr.io/library/node:20-alpine AS runner # Mirror fix também na imagem final (boa prática para auditorias ou instalações extras) RUN sed -i 's/dl-cdn.alpinelinux.org/mirror.leaseweb.com/g' /etc/apk/repositories && \ addgroup -g 1001 -S nodejs && \ adduser -S nestjs -u 1001 -G nodejs WORKDIR /app # Copia apenas o necessário do estágio de build COPY --from=builder --chown=nestjs:nodejs /app/dist ./dist COPY --from=builder --chown=nestjs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nestjs:nodejs /app/package.json ./ ENV NODE_ENV=production \ BACKOFFICE_PORT=3001 \ BACKOFFICE_HOST=0.0.0.0 USER nestjs EXPOSE 3001 CMD ["node", "dist/main.js"]