# Multi-stage build for Who Did It? (Node + React) FROM node:20-slim AS builder WORKDIR /app # Copy package files COPY client/package.json client/package-lock.json* client/ COPY server/package.json server/package-lock.json* server/ # Install dependencies RUN cd client && (npm ci 2>/dev/null || npm install) RUN cd server && (npm ci 2>/dev/null || npm install) # Copy source and build client COPY client/ client/ COPY server/ server/ RUN cd client && npm run build # Final stage FROM node:20-slim ENV NODE_ENV=production # Create non-root user (UID 1001 - node image may already use 1000) RUN useradd -m -u 1001 appuser WORKDIR /app # Copy server (includes node_modules from builder) COPY --from=builder /app/server /app/server COPY --from=builder /app/client/dist /app/client/dist # Ensure data directory exists RUN mkdir -p /app/server/data && chown -R appuser:appuser /app # Entrypoint script COPY docker-entrypoint.sh /docker-entrypoint.sh RUN tr -d '\r' < /docker-entrypoint.sh > /docker-entrypoint.sh.tmp && \ mv /docker-entrypoint.sh.tmp /docker-entrypoint.sh && \ chmod +x /docker-entrypoint.sh && \ chown appuser:appuser /docker-entrypoint.sh USER appuser EXPOSE 3001 ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["node", "index.js"]