uchill/front_material/Dockerfile

125 lines
4.3 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
ARG NEXT_PUBLIC_EXCALIDRAW_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 NEXT_PUBLIC_EXCALIDRAW_URL=$NEXT_PUBLIC_EXCALIDRAW_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
ARG NEXT_PUBLIC_EXCALIDRAW_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 NEXT_PUBLIC_EXCALIDRAW_URL=$NEXT_PUBLIC_EXCALIDRAW_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
# Проверяем, что standalone создался (выводим структуру для отладки)
RUN echo "=== Checking standalone output ===" && \
ls -la /app/.next/ || echo "No .next directory" && \
ls -la /app/.next/standalone/ 2>/dev/null || echo "No standalone directory" && \
test -f /app/.next/standalone/server.js || (echo "ERROR: server.js not found in standalone" && ls -la /app/.next/standalone/ && exit 1)
# Production stage
FROM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
# Копируем собранное приложение (standalone mode)
# В Next.js standalone структура: /app/.next/standalone/ содержит server.js, .next/server/, node_modules/
# Копируем всё содержимое standalone в корень /app
COPY --from=production-build --chown=nextjs:nodejs /app/.next/standalone ./
# Статические файлы (standalone их не включает автоматически)
COPY --from=production-build --chown=nextjs:nodejs /app/.next/static ./.next/static
# Public файлы (standalone их не включает автоматически)
COPY --from=production-build --chown=nextjs:nodejs /app/public ./public
# Проверяем, что server.js существует
RUN test -f /app/server.js || (echo "ERROR: server.js not found after copy" && ls -la /app/ && exit 1)
# Создаем непривилегированного пользователя
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
USER nextjs
# Открываем порт
EXPOSE 3000
# Запускаем production server
CMD ["node", "server.js"]