reactopt-reactopt
SUCCESS
35m 28s
History Source
SummaryIterations2Transcript22Dockerfile
Dockerfile38 lines · 1344 chars
# 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"]