Установка зависимостей в контейнере

Puppeteer — это библиотека для автоматизации браузера Chrome/Chromium через API Node.js. Для её стабильной работы в контейнеризованных средах, таких как Docker, требуется корректная настройка окружения и установка зависимостей, которые обеспечивают работу браузера без графического интерфейса.

Выбор базового образа

Для контейнеров обычно используют легковесные образы Linux. Наиболее популярные:

  • node:18-slim — минимальный образ Node.js с Debian Slim.
  • ubuntu:22.04 — универсальный образ для сложных сборок и кастомных библиотек.

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

Установка системных зависимостей

Chromium требует ряда библиотек для корректной работы в headless-режиме. Простейший набор для Debian/Ubuntu включает:

RUN apt-get update && apt-get install -y \
    ca-certificates \
    fonts-liberation \
    libappindicator3-1 \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libcups2 \
    libdbus-1-3 \
    libdrm2 \
    libgbm1 \
    libgtk-3-0 \
    libnspr4 \
    libnss3 \
    libx11-xcb1 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    xdg-utils \
    wget \
    --no-install-recommends && rm -rf /var/lib/apt/lists/*

Ключевые моменты:

  • –no-install-recommends сокращает размер образа, устанавливая только необходимые пакеты.
  • Очистка кэша (rm -rf /var/lib/apt/lists/*) уменьшает итоговый размер контейнера.

Установка Puppeteer

Puppeteer можно установить через npm, при этом по умолчанию он загружает совместимую версию Chromium. Для Node.js 18+ установка выглядит так:

RUN npm install puppeteer --save

Для контейнеров с ограниченным доступом к интернету можно использовать Puppeteer без скачивания Chromium:

RUN npm install puppeteer-core --save

и указывать путь к локальному браузеру, который уже установлен в образе.

Настройка окружения для Headless Chrome

Чтобы Chromium корректно работал в Docker:

  • Использовать флаг –no-sandbox, так как контейнеры часто запускаются с ограниченными правами:
const browser = await puppeteer.launch({
    headless: true,
    args: [&
});
  • Включение –disable-dev-shm-usage предотвращает ошибки из-за нехватки shared memory в контейнере:
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']

Кэширование зависимостей

Для ускорения сборки контейнера важно кэшировать слои, которые редко меняются:

COPY package.json package-lock.json ./
RUN npm install
COPY . .

Это позволяет при изменении исходного кода не пересобирать заново весь слой с npm.

Проверка установки

После сборки контейнера проверка работоспособности Puppeteer и Chromium выполняется простым скриптом:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] });
    const page = await browser.newPage();
    await page.goto('https://example.com');
    console.log(await page.title());
    await browser.close();
})();

Вывод заголовка страницы подтверждает успешную установку всех зависимостей и корректную работу браузера внутри контейнера.

Оптимизация размера образа

  • Использование node:slim или alpine вместо полного node уменьшает размер.
  • Удаление временных файлов после установки библиотек.
  • Установка Puppeteer через –ignore-scripts при использовании локального Chromium.

Особенности для CI/CD

При запуске в CI/CD рекомендуется:

  • Проверять наличие всех библиотек для Chromium.
  • Использовать отдельный слой для установки системных зависимостей, чтобы его кэшировать между сборками.
  • Включать переменные окружения, такие как PUPPETEER_SKIP_CHROMIUM_DOWNLOAD, если Chromium уже присутствует в образе.

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