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 можно установить через npm, при этом по умолчанию он загружает совместимую версию Chromium. Для Node.js 18+ установка выглядит так:
RUN npm install puppeteer --save
Для контейнеров с ограниченным доступом к интернету можно использовать Puppeteer без скачивания Chromium:
RUN npm install puppeteer-core --save
и указывать путь к локальному браузеру, который уже установлен в образе.
Чтобы 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 уменьшает размер.
–ignore-scripts при использовании
локального Chromium.
При запуске в CI/CD рекомендуется:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD, если Chromium уже
присутствует в образе.
Эти шаги обеспечивают стабильную работу Puppeteer в контейнеризованной среде, позволяя выполнять автоматизированное тестирование и скрейпинг без GUI и с минимальными затратами ресурсов.