Dockerfile.demo

Обзор

Данный файл Dockerfile.demo предназначен для создания Docker-образа демонстрационного клиента с использованием многоступенчатой сборки (multi-stage build). Он состоит из двух основных этапов:

  1. Сборка приложения — установка зависимостей, копирование исходного кода и сборка приложения.

  2. Создание продакшен-образа — подготовка минимального окружения для запуска уже собранного приложения с использованием небезопасного пользователя и настройки портов, переменных окружения, а также проверки здоровья контейнера.

Цель такого подхода — уменьшить размер итогового образа и повысить безопасность запускаемого контейнера.


Подробное описание содержимого

Этап 1: Сборка (builder)

FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

Этап 2: Продакшен-окружение (runner)

FROM node:18-alpine AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
RUN chown -R nextjs:nodejs /app
USER nextjs
EXPOSE 3000
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/api/health || exit 1
CMD ["node", "server.js"]

Важные детали реализации


Взаимодействие с другими частями системы


Пример использования

# Сборка образа
docker build -f Dockerfile.demo -t demo-client .

# Запуск контейнера
docker run -p 3000:3000 demo-client

После запуска приложение будет доступно по адресу http://localhost:3000, а Docker будет автоматически следить за состоянием контейнера с помощью healthcheck.


Диаграмма структуры Dockerfile.demo

flowchart TD
    A[Start: FROM node:18-alpine AS builder]
    A --> B[WORKDIR /app]
    B --> C[COPY package*.json ./]
    C --> D[RUN npm ci --only=production]
    D --> E[COPY . .]
    E --> F[RUN npm run build]
    F --> G[FROM node:18-alpine AS runner]
    G --> H[WORKDIR /app]
    H --> I[Create group 'nodejs' (gid 1001)]
    I --> J[Create user 'nextjs' (uid 1001)]
    J --> K[COPY built app files from builder]
    K --> L[Set ownership to nextjs:nodejs]
    L --> M[Set USER nextjs]
    M --> N[EXPOSE 3000]
    N --> O[Set ENV variables PORT and HOSTNAME]
    O --> P[HEALTHCHECK /api/health]
    P --> Q[CMD node server.js]

Итог

Файл Dockerfile.demo является оптимизированным и безопасным способом сборки и запуска демо-клиента на Node.js. Использование многоступенчатой сборки, небезопасного пользователя и healthcheck делает его пригодным для современных контейнерных сред и CI/CD процессов.