# Многоступенчатая сборка для оптимизации размера образа # Стадия 1: Установка ТОЛЬКО production зависимостей (быстро) FROM node:18-alpine AS prod-deps RUN apk add --no-cache libc6-compat openssl WORKDIR /app COPY nextjs_space/package.json nextjs_space/yarn.lock ./ ENV NODE_ENV=production ENV SKIP_SASS_BINARY_DOWNLOAD_FOR_CI=true ENV CYPRESS_INSTALL_BINARY=0 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # Только production зависимости - БЫСТРО! # --ignore-scripts: пропускаем компиляцию нативных модулей RUN yarn install --production --network-timeout 300000 --ignore-scripts # Стадия 2: Установка ВСЕХ зависимостей для сборки (медленно, но с кешем) FROM node:18-alpine AS deps RUN apk add --no-cache libc6-compat openssl python3 make g++ WORKDIR /app COPY nextjs_space/package.json nextjs_space/yarn.lock ./ ENV NODE_ENV=development ENV SKIP_SASS_BINARY_DOWNLOAD_FOR_CI=true ENV CYPRESS_INSTALL_BINARY=0 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # Все зависимости для сборки (с кешем из предыдущей стадии) # --ignore-scripts: пропускаем компиляцию нативных модулей RUN yarn install --network-timeout 300000 --ignore-scripts # Стадия 3: Сборка приложения FROM node:18-alpine AS builder RUN apk add --no-cache libc6-compat openssl WORKDIR /app # Копируем зависимости из предыдущей стадии COPY --from=deps /app/node_modules ./node_modules COPY nextjs_space/ ./ # Используем production конфигурацию RUN if [ -f next.config.prod.js ]; then mv next.config.prod.js next.config.js; fi # Генерируем Prisma Client RUN npx prisma generate # Создаем .env файл для сборки ARG NEXT_PUBLIC_SITE_URL ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-http://localhost:3000} ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Собираем приложение RUN yarn build # Стадия 4: Production образ (runtime) FROM node:18-alpine AS runner WORKDIR /app # Устанавливаем необходимые пакеты RUN apk add --no-cache openssl libc6-compat ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Создаем пользователя для безопасности RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs # Копируем необходимые файлы из builder COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static # Копируем Prisma схему и клиент COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma USER nextjs EXPOSE 3000 ENV PORT=3000 ENV HOSTNAME="0.0.0.0" # Запускаем приложение CMD ["node", "server.js"]