4
0

Dockerfile 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. ARG APP_VERSION=development
  21. ENV APP_VERSION=${APP_VERSION}
  22. ENV NODE_ENV=production
  23. ENV NEXT_TELEMETRY_DISABLED=1
  24. RUN addgroup --system --gid 1001 nodejs && \
  25. adduser --system --uid 1001 --home /home/nextjs nextjs
  26. # Install runtime dependencies (prisma CLI + serverExternalPackages)
  27. # Must run before standalone copy to avoid conflicts with bundled node_modules
  28. COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
  29. RUN npm install @prisma/client@6.19.2 prisma@6.19.2 @prisma/adapter-pg@6.19.2 pg && \
  30. chown -R nextjs:nodejs /app/node_modules
  31. RUN apk add --no-cache bash
  32. COPY --from=builder /app/public ./public
  33. COPY --from=builder /app/prisma ./prisma
  34. COPY --from=builder /app/init-db.sh ./init-db.sh
  35. # Automatically leverage output traces to reduce image size
  36. COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
  37. COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
  38. # Create uploads directories
  39. RUN mkdir -p /app/data/uploads && chown -R nextjs:nodejs /app/data
  40. USER nextjs
  41. EXPOSE 3000
  42. ENV PORT=3000
  43. ENV HOSTNAME="0.0.0.0"
  44. ENTRYPOINT ["./init-db.sh"]
  45. CMD ["node", "server.js"]