108 lines
3.1 KiB
Docker
108 lines
3.1 KiB
Docker
# Multi-stage build для оптимизации размера образа
|
||
|
||
# Development stage
|
||
FROM node:20-alpine AS development
|
||
|
||
WORKDIR /app
|
||
|
||
# Аргументы сборки для Next.js (должны быть доступны во время сборки)
|
||
ARG NEXT_PUBLIC_API_URL
|
||
ARG NEXT_PUBLIC_WS_URL
|
||
ARG NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
||
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
|
||
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
|
||
ENV NODE_ENV=development
|
||
ENV HOSTNAME=0.0.0.0
|
||
ENV WATCHPACK_POLLING=true
|
||
ENV CHOKIDAR_USEPOLLING=true
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем зависимости
|
||
RUN npm install
|
||
|
||
# Копируем остальные файлы (при запуске в compose поверх монтируется volume)
|
||
COPY . .
|
||
|
||
# Entrypoint: при volume-монтировании /app/node_modules при первом запуске пуст — ставим зависимости
|
||
RUN echo '#!/bin/sh' > /entrypoint.sh && \
|
||
echo 'set -e' >> /entrypoint.sh && \
|
||
echo 'if [ ! -d node_modules/next ] 2>/dev/null || [ ! -f node_modules/.package-lock.json ] 2>/dev/null; then npm install; fi' >> /entrypoint.sh && \
|
||
echo 'exec npx next dev --webpack --hostname 0.0.0.0' >> /entrypoint.sh && \
|
||
chmod +x /entrypoint.sh
|
||
|
||
# Открываем порт
|
||
EXPOSE 3000
|
||
|
||
ENTRYPOINT ["/entrypoint.sh"]
|
||
|
||
# Production dependencies stage
|
||
FROM node:20-alpine AS production-deps
|
||
|
||
WORKDIR /app
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем только production зависимости
|
||
RUN npm ci --only=production && npm cache clean --force
|
||
|
||
# Production build stage
|
||
FROM node:20-alpine AS production-build
|
||
|
||
WORKDIR /app
|
||
|
||
# Аргументы сборки для Next.js
|
||
ARG NEXT_PUBLIC_API_URL
|
||
ARG NEXT_PUBLIC_WS_URL
|
||
ARG NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
||
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
|
||
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем все зависимости для сборки
|
||
RUN npm ci
|
||
|
||
# Копируем исходный код
|
||
COPY . .
|
||
|
||
# Папка public может отсутствовать — Next.js работает и без неё
|
||
RUN mkdir -p public
|
||
|
||
# Собираем приложение с оптимизацией
|
||
ENV NODE_ENV=production
|
||
RUN npm run build
|
||
|
||
# Production stage
|
||
FROM node:20-alpine AS production
|
||
|
||
WORKDIR /app
|
||
|
||
# Копируем собранное приложение (standalone mode)
|
||
COPY --from=production-build /app/.next/standalone ./
|
||
COPY --from=production-build /app/.next/static ./.next/static
|
||
COPY --from=production-build /app/public ./public
|
||
|
||
# Создаем непривилегированного пользователя
|
||
RUN addgroup --system --gid 1001 nodejs
|
||
RUN adduser --system --uid 1001 nextjs
|
||
RUN chown -R nextjs:nodejs /app
|
||
USER nextjs
|
||
|
||
# Открываем порт
|
||
EXPOSE 3000
|
||
|
||
ENV NODE_ENV=production
|
||
ENV PORT=3000
|
||
ENV HOSTNAME="0.0.0.0"
|
||
|
||
# Запускаем production server
|
||
CMD ["node", "server.js"]
|