| # Build stage | |
| FROM node:18-alpine as builder | |
| WORKDIR /app | |
| # Copy dependency files | |
| COPY package*.json ./ | |
| # Install dependencies | |
| RUN npm ci --prefer-offline --no-audit | |
| # Copy source code | |
| COPY . . | |
| # Build application | |
| RUN npm run build | |
| # Production stage | |
| FROM node:18-alpine | |
| WORKDIR /app | |
| # Copy built application from builder | |
| COPY --from=builder --chown=node:node /app/.next ./.next | |
| COPY --from=builder --chown=node:node /app/public ./public | |
| COPY --from=builder --chown=node:node /app/node_modules ./node_modules | |
| COPY --from=builder --chown=node:node /app/package*.json ./ | |
| COPY --from=builder --chown=node:node /app/next.config.js ./ | |
| # Set environment | |
| ENV NODE_ENV=production \ | |
| NEXT_TELEMETRY_DISABLED=1 | |
| # Switch to non-root user | |
| USER node | |
| # Health check | |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ | |
| CMD wget --quiet --tries=1 --spider http://localhost:7860/ || exit 1 | |
| EXPOSE 7860 | |
| CMD ["npm", "start", "--", "-p", "7860"] | |