Dockerfile.demo
Обзор
Данный файл Dockerfile.demo предназначен для создания Docker-образа демонстрационного клиента с использованием многоступенчатой сборки (multi-stage build). Он состоит из двух основных этапов:
Сборка приложения — установка зависимостей, копирование исходного кода и сборка приложения.
Создание продакшен-образа — подготовка минимального окружения для запуска уже собранного приложения с использованием небезопасного пользователя и настройки портов, переменных окружения, а также проверки здоровья контейнера.
Цель такого подхода — уменьшить размер итогового образа и повысить безопасность запускаемого контейнера.
Подробное описание содержимого
Этап 1: Сборка (builder)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:18-alpine AS builder — базовый образ с Node.js 18 на Alpine Linux для минимального размера.
WORKDIR /app — рабочая директория внутри контейнера.
COPY package.json ./* — копирование файлов
package.jsonиpackage-lock.jsonдля установки зависимостей.RUN npm ci --only=production — установка только production-зависимостей с использованием
npm ciдля чистой установки.COPY . . — копирование всего исходного кода приложения.
RUN npm run build — запуск скрипта сборки приложения (например, компиляция TypeScript, сборка Next.js).
Этап 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"]
FROM node:18-alpine AS runner — второй этап с тем же базовым образом для запуска приложения.
RUN addgroup/adduser — создание системной группы и пользователя с фиксированными UID/GID (1001) для повышения безопасности, чтобы контейнер не запускался от root.
COPY --from=builder ... — копирование из предыдущего этапа необходимых для работы приложения директорий:
/app/public— статические файлы./app/.next/standalone— собранный серверный код (Next.js standalone build)./app/.next/static— статические файлы Next.js.
RUN chown -R nextjs:nodejs /app — установка прав владельца на файлы для пользователя
nextjs.USER nextjs — переключение на небезопасного пользователя.
EXPOSE 3000 — открытие порта 3000 для доступа к приложению.
ENV PORT 3000, ENV HOSTNAME "0.0.0.0" — установка переменных окружения для конфигурации приложения.
HEALTHCHECK — проверка состояния приложения путем запроса к эндпоинту
/api/healthкаждые 30 секунд. Если проверка не проходит, контейнер считается нездоровым.CMD ["node", "server.js"] — команда запуска приложения.
Важные детали реализации
Использование многоступенчатой сборки позволяет исключить из финального образа исходный код и инструменты разработки, оставляя только необходимые для выполнения файлы.
Применение Alpine Linux минимизирует размер образа.
Создание непользовательского пользователя и группы повышает безопасность путем ограничения прав.
Использование
npm ci --only=productionгарантирует, что в образ попадут только необходимые зависимости.HEALTHCHECK помогает оркестраторам (например, Kubernetes) автоматически мониторить состояние контейнера.
Взаимодействие с другими частями системы
Этот Dockerfile используется для сборки и упаковки демо-клиента, скорее всего, веб-приложения на базе Next.js (исходя из путей
.nextи команды сборки).Собранный образ может быть запущен в любых Docker-совместимых средах, включая локальные машины разработчиков, CI/CD пайплайны и продакшен кластеры.
Эндпоинт
/api/healthдолжен быть реализован в серверной части приложения и служит точкой проверки состояния.Взаимодействует с системой управления зависимостями Node.js (
npm), а также с системой управления пользователями внутри контейнера.
Пример использования
# Сборка образа
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 процессов.