# multi-stage build for reactopt CLI tool
FROM node:lts AS builder
WORKDIR /app
# Install system dependencies required for npm/yarn and Puppeteer
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
# Install dependencies first to leverage Docker layer caching
COPY package.json ./
RUN npm install --legacy-peer-deps
# Copy the rest of the source and build the bundle with webpack
COPY . .
RUN npx webpack --config webpack.config.js
# Runtime stage
FROM node:lts
WORKDIR /app
# Install runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
# Copy built assets from builder
COPY --from=builder /app/bundle.js ./bundle.js
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
# Copy media assets needed at runtime
COPY --from=builder /app/media ./media
# Also copy media assets to /media as a quick workaround for asset loading paths
COPY --from=builder /app/media /media
# Create a non-root user for running the CLI
RUN groupadd -r appuser && useradd -r -g appuser appuser && mkdir -p /home/appuser && chown -R appuser:appuser /app
USER appuser
# Run the bundled CLI by default; allow URL to be provided at runtime
ENTRYPOINT ["node","bundle.js"]