Docker Compose позволяет управлять многоконтейнерными приложениями, что особенно полезно при масштабировании тестов с Puppeteer. Puppeteer требует запуска браузера Chromium, который является ресурсоёмким компонентом. Для параллельного выполнения большого числа тестов использование отдельных контейнеров для каждого экземпляра браузера значительно упрощает управление ресурсами и повышает стабильность тестов.
Основные шаги:
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"]
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 обеспечивает синхронизацию локальных тестов с
контейнерами, что упрощает обновление сценариев без пересборки образа.
deploy.resources.limits.
volumes:
- ./logs:/app/logs
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();
})();
Контейнеры запускаются одновременно, и каждый обрабатывает свою часть сценариев. Это позволяет масштабировать тесты до десятков экземпляров, ограниченных только ресурсами хоста.
–no-sandbox и
–disable-setuid-sandbox для запуска Chromium в контейнерах.
- name: Build and run Puppeteer tests
run: docker-compose up --build --abort-on-container-exit
Флаг –abort-on-container-exit гарантирует, что выполнение
завершится, если любой контейнер завершится с ошибкой, что удобно для
автоматической проверки качества кода.
Использование Docker Compose в связке с Puppeteer позволяет
масштабировать тестирование, поддерживать изоляцию браузеров и управлять
ресурсами при параллельном выполнении сценариев. Настройка
shm_size, разделение нагрузки и централизованное хранение
логов повышают надежность и повторяемость тестов в больших проектах.