# syntax=docker/dockerfile:1.7 # ─── Stage 1: build React ──────────────────────────────────────── FROM node:20-alpine AS builder WORKDIR /app # Зависимости (кэшируется) COPY package.json package-lock.json ./ RUN npm install --no-audit --no-fund --legacy-peer-deps # Исходники COPY public ./public COPY src ./src ENV GENERATE_SOURCEMAP=false \ DISABLE_ESLINT_PLUGIN=true \ NODE_OPTIONS=--max_old_space_size=4096 RUN npm run build # ─── Stage 2: runtime — лёгкий статический сервер ──────────────── FROM node:20-alpine AS runtime WORKDIR /app # `serve` — минималистичный SPA-сервер (~2 МБ), флаг -s = SPA fallback на index.html RUN npm install -g serve@14.2.4 && \ addgroup -S app && adduser -S app -G app # Только готовый билд COPY --from=builder --chown=app:app /app/build ./build USER app ENV NODE_ENV=production \ PORT=24452 EXPOSE 24452 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD wget -qO- http://localhost:24452/ > /dev/null 2>&1 || exit 1 CMD ["serve", "-s", "build", "-l", "24452", "--no-clipboard"]