# Stage 1: Build the Next.js application | |
FROM node:20-alpine AS builder | |
RUN apk add --no-cache libc6-compat | |
WORKDIR /app | |
# Install dependencies | |
COPY frontend/package.json frontend/package-lock.json ./ | |
RUN npm install | |
# Copy source files and build the Next.js application | |
COPY frontend ./ | |
RUN npm run build | |
# Install PM2 globally | |
RUN npm install -g pm2 | |
# Stage 2: Run the Next.js application with PM2 | |
FROM node:20-alpine | |
# Create necessary directories with write permissions | |
WORKDIR /tmp | |
RUN mkdir -p /tmp/app/.next/cache/images && chown -R node:node /tmp/app/.next/cache/images | |
# Copy the Next.js build and node_modules from the builder stage | |
COPY --from=builder /app /tmp/app | |
WORKDIR /tmp/app | |
# Install PM2 globally | |
RUN npm install -g pm2 | |
# Set environment variables | |
ENV PORT=7860 | |
# Expose port 7860 | |
EXPOSE 7860 | |
# Run the application with PM2 | |
USER node | |
CMD ["pm2-runtime", "start", "npm", "--", "start"] |