# Multi-stage build для оптимального размера FROM node:20-alpine AS base # Установка зависимостей для сборки RUN apk add --no-cache libc6-compat curl # Dependencies stage FROM base AS deps WORKDIR /app # Копирование файлов зависимостей COPY package.json package-lock.json* ./ # Установка зависимостей RUN npm ci --only=production && npm cache clean --force # Builder stage FROM base AS builder WORKDIR /app # Копирование зависимостей из предыдущего stage COPY --from=deps /app/node_modules ./node_modules # Копирование исходного кода COPY . . # Build arguments ARG BUILD_VERSION=latest ARG BUILD_DATE ARG VCS_REF ARG NEXT_PUBLIC_API_URL # Переменные окружения для сборки ENV NODE_ENV=production \ NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \ BUILD_VERSION=$BUILD_VERSION # Генерация статических файлов Next.js RUN npm run build # Production stage FROM node:20-alpine AS runner # Build arguments для метаданных ARG BUILD_VERSION=latest ARG BUILD_DATE ARG VCS_REF # Метаданные образа LABEL org.opencontainers.image.title="CatLink Frontend" \ org.opencontainers.image.description="Next.js приложение для CatLink" \ org.opencontainers.image.version="$BUILD_VERSION" \ org.opencontainers.image.created="$BUILD_DATE" \ org.opencontainers.image.revision="$VCS_REF" \ org.opencontainers.image.source="https://github.com/smartsoltech/links" WORKDIR /app # Создание пользователя приложения RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs # Копирование собранного приложения 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 # Переменные окружения ENV NODE_ENV=production \ PORT=3000 \ HOSTNAME="0.0.0.0" # Переключение на пользователя приложения USER nextjs # Health check HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ CMD curl -f http://localhost:$PORT/health || exit 1 # Открытие порта EXPOSE $PORT # Команда запуска CMD ["node", "server.js"]