Docker Compose для масштабирования

Docker Compose позволяет управлять многоконтейнерными приложениями, что особенно полезно при масштабировании тестов с Puppeteer. Puppeteer требует запуска браузера Chromium, который является ресурсоёмким компонентом. Для параллельного выполнения большого числа тестов использование отдельных контейнеров для каждого экземпляра браузера значительно упрощает управление ресурсами и повышает стабильность тестов.

Основные шаги:

  1. Создание Dockerfile для Puppeteer Puppeteer требует специфической среды с установленными библиотеками для запуска Chromium. Оптимальный Dockerfile выглядит так:
FROM node:20-slim


RUN apt-get update && apt-get install -y \
    gconf-service \
    libasound2 \
    libatk1.0-0 \
    libc6 \
    libcairo2 \
    libcups2 \
    libdbus-1-3 \
    libexpat1 \
    libfontconfig1 \
    libgcc1 \
    libgconf-2-4 \
    libgdk-pixbuf2.0-0 \
    libglib2.0-0 \
    libgtk-3-0 \
    libnspr4 \
    libpango-1.0-0 \
    libstdc++6 \
    libx11-6 \
    libx11-xcb1 \
    libxcb1 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxi6 \
    libxrandr2 \
    libxrender1 \
    libxss1 \
    libxtst6 \
    ca-certificates \
    fonts-liberation \
    libnss3 \
    lsb-release \
    wget \
    xdg-utils \
    --no-install-recommends && rm -rf /var/lib/apt/lists/*

# Создание рабочей директории
WORKDIR /app

# Копирование зависимостей
COPY package*.json ./
RUN npm install --production

# Копирование исходного кода
COPY . .

# Установка Puppeteer без скачивания Chromium, если используется системный
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true

CMD ["node", "run-tests.js"]
  1. Конфигурация docker-compose.yml Для масштабирования тестов удобно создавать несколько экземпляров браузера. Пример конфигурации:
version: "3.9"

services:
  puppeteer:
    build: .
    deploy:
      replicas: 3
    environment:
      - NODE_ENV=production
    volumes:
      - ./tests:/app/tests
    shm_size: "2gb"

Пояснения к ключевым параметрам:

  • replicas позволяет запускать несколько контейнеров одновременно для параллельного выполнения тестов.
  • shm_size критически важен для Puppeteer, так как Chromium интенсивно использует shared memory. Недостаточный размер может приводить к сбоям браузера.
  • volumes обеспечивает синхронизацию локальных тестов с контейнерами, что упрощает обновление сценариев без пересборки образа.
  1. Оптимизация параллельного запуска Для эффективного масштабирования необходимо учитывать:
  • Разделение нагрузки: каждый контейнер запускает отдельный набор тестов. Это позволяет избежать конфликтов с сессиями браузера.
  • Мониторинг ресурсов: контейнеры с Puppeteer потребляют много RAM и CPU, поэтому важно контролировать лимиты ресурсов через deploy.resources.limits.
  • Логи и отчеты: для централизованного анализа тестов рекомендуется монтировать общую папку для логов на хосте, например:
volumes:
  - ./logs:/app/logs
  1. Примеры параллельного запуска Для распределения тестов по контейнерам можно использовать Node.js и пакет jest или mocha-parallel-tests. В каждом контейнере выполняется скрипт с диапазоном тестов:
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
  });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  // Логика тестов
  await browser.close();
})();

Контейнеры запускаются одновременно, и каждый обрабатывает свою часть сценариев. Это позволяет масштабировать тесты до десятков экземпляров, ограниченных только ресурсами хоста.

  1. Рекомендации по стабильности
  • Использовать –no-sandbox и –disable-setuid-sandbox для запуска Chromium в контейнерах.
  • Регулярно обновлять Node.js и Puppeteer, так как новые версии улучшают совместимость с контейнерами.
  • Минимизировать количество зависимостей в образе, чтобы ускорить сборку и снизить нагрузку на сеть.
  1. Поддержка CI/CD Docker Compose идеально интегрируется с Jenkins, GitHub Actions или GitLab CI. Для этого достаточно добавить шаги:
- name: Build and run Puppeteer tests
  run: docker-compose up --build --abort-on-container-exit

Флаг –abort-on-container-exit гарантирует, что выполнение завершится, если любой контейнер завершится с ошибкой, что удобно для автоматической проверки качества кода.


Использование Docker Compose в связке с Puppeteer позволяет масштабировать тестирование, поддерживать изоляцию браузеров и управлять ресурсами при параллельном выполнении сценариев. Настройка shm_size, разделение нагрузки и централизованное хранение логов повышают надежность и повторяемость тестов в больших проектах.