Dockerfile 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. FROM node:20-alpine AS base
  2. # Install dependencies only when needed
  3. FROM base AS deps
  4. RUN apk add --no-cache libc6-compat
  5. WORKDIR /app
  6. COPY package.json package-lock.json* ./
  7. RUN npm ci
  8. # Rebuild the source code only when needed
  9. FROM base AS builder
  10. WORKDIR /app
  11. COPY --from=deps /app/node_modules ./node_modules
  12. COPY . .
  13. # Generate Prisma client
  14. RUN npx prisma generate
  15. ENV NEXT_TELEMETRY_DISABLED=1
  16. RUN npm run build
  17. # Production image, copy all the files and run next
  18. FROM base AS runner
  19. WORKDIR /app
  20. ENV NODE_ENV=production
  21. ENV NEXT_TELEMETRY_DISABLED=1
  22. RUN addgroup --system --gid 1001 nodejs && \
  23. adduser --system --uid 1001 --home /home/nextjs nextjs
  24. # Install runtime dependencies (prisma CLI + serverExternalPackages)
  25. # Must run before standalone copy to avoid conflicts with bundled node_modules
  26. COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
  27. RUN npm install @prisma/client@6.19.2 prisma@6.19.2 @prisma/adapter-pg@6.19.2 pg && \
  28. chown -R nextjs:nodejs /app/node_modules
  29. RUN apk add --no-cache bash
  30. COPY --from=builder /app/public ./public
  31. COPY --from=builder /app/prisma ./prisma
  32. COPY --from=builder /app/init-db.sh ./init-db.sh
  33. # Automatically leverage output traces to reduce image size
  34. COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
  35. COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
  36. # Create uploads directories
  37. RUN mkdir -p /app/data/uploads && chown -R nextjs:nodejs /app/data
  38. USER nextjs
  39. EXPOSE 3000
  40. ENV PORT=3000
  41. ENV HOSTNAME="0.0.0.0"
  42. ENTRYPOINT ["./init-db.sh"]
  43. CMD ["node", "server.js"]