# Build stage FROM node:18-alpine AS builder WORKDIR /app # Copy package files COPY package*.json ./ RUN npm ci # Copy source code COPY . . # Set build-time environment variables ENV NEXT_TELEMETRY_DISABLED=1 ENV NODE_ENV=production # Build Next.js application RUN npm run build # Production stage FROM node:18-alpine WORKDIR /app # Install dumb-init for proper signal handling RUN apk add --no-cache dumb-init # Create non-root user RUN addgroup -g 1001 -S nodejs && \ adduser -S dyolink -u 1001 # Copy package files COPY package*.json ./ # Install production dependencies only RUN npm ci --only=production && \ npm cache clean --force # Copy built application COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/next.config.js ./next.config.js COPY --from=builder /app/package.json ./package.json # Create logs directory RUN mkdir -p /app/logs && \ chown -R dyolink:nodejs /app # Set ownership RUN chown -R dyolink:nodejs /app # Switch to non-root user USER dyolink # Health check HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \ CMD node -e "require('http').get('http://localhost:3000', (r) => {if(r.statusCode!==200)throw new Error()})" || exit 1 EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" ENV NODE_ENV=production # Copy entrypoint script COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh # Use dumb-init for signal handling ENTRYPOINT ["dumb-init", "--", "docker-entrypoint.sh"] CMD ["npm", "start"]