Запуск в Docker
Настройка браузеров без графического интерфейса в Docker может быть сложной задачей. Но не стоит беспокоиться об этом, так как мы уже создали базовые образы, которые вы можете свободно использовать. Мы используем их ежедневно на Платформе Apify.
Все образы можно найти в нашем репозитории GitHub и на DockerHub.
Обзор
Браузеры занимают много места, поэтому мы предоставляем различные образы для разных потребностей. Вот полный список наших Docker-образов:
apify/actor-node
apify/actor-node-puppeteer-chrome
apify/actor-node-playwright
apify/actor-node-playwright-chrome
apify/actor-node-playwright-firefox
apify/actor-node-playwright-webkit
Версионирование
Каждый образ имеет до 2-х версионных тегов, в зависимости от типа образа: один для версии Node.js и второй для предустановленной библиотеки веб-автоматизации. Если использовать имя образа без тега версии, вы всегда получите последнюю доступную версию.
Для продакшн-окружения мы рекомендуем всегда указывать как минимум тег версии Node.js в Dockerfile. Это гарантирует, что будущие обновления Node.js не нарушат работу ваших автоматизаций.
Версионирование Node.js
Наши образы собраны с несколькими версиями Node.js для обеспечения обратной совместимости. В настоящее время поддерживаются версии Node.js 16 и 18 (устаревшие версии доступны на DockerHub). Чтобы выбрать нужную версию, используйте соответствующий номер в качестве тега образа.
# Использовать Node.js 20
FROM apify/actor-node:20
Версионирование библиотек автоматизации
Образы с предустановленными библиотеками автоматизации (все образы, содержащие puppeteer
или playwright
в названии) также имеют тег с версией предустановленной библиотеки. Например, apify/actor-node-puppeteer-chrome:20-22.1.0
поставляется с Node.js 20 и Puppeteer v22.1.0. Если вы попытаетесь установить другую версию Puppeteer в этот образ, могут возникнуть проблемы совместимости, поскольку версия Chromium, поставляемая с puppeteer
, не будет соответствовать предустановленной версии.
Аналогично, apify/actor-node-playwright-firefox:14-1.21.1
работает на Node.js 14 и имеет предустановленную версию Firefox, совместимую с v1.21.1.
При установке apify/actor-node-puppeteer-chrome
(без тега) будет установлена последняя доступная версия Node.js и puppeteer
.
Теги предварительных релизов
Мы также создаем предварительные версии образов для тестирования изменений. Обычно они обозначаются суффиксом beta
, но это может варьироваться в зависимости от наших потребностей. Если вам нужно попробовать предварительную версию, вы можете сделать это так:
# Без версии библиотеки
FROM apify/actor-node:20-beta
# С версией библиотеки
FROM apify/actor-node-playwright-chrome:20-1.10.0-beta
Лучшие практики
- Тег версии Node.js должен использоваться всегда
- Тег версии библиотеки автоматизации рекомендуется использовать для дополнительной безопасности
- В файлах
package.json
следует использовать звездочку*
в качестве версии библиотеки автоматизации
Это гарантирует, что предустановленная версия Puppeteer или Playwright не будет переустановлена при сборке. Это важно, поскольку эти библиотеки гарантированно работают только с определенными версиями браузеров, которые поставляются предустановленными в образе.
FROM apify/actor-node-playwright-chrome:20
{
"dependencies": {
"crawlee": "^3.0.0",
"playwright": "*"
}
}
Предупреждение о размере образа
Браузеры занимают много места. Если вам не нужны все браузеры в вашем образе, лучше использовать образ меньшего размера только с нужным браузером.
Также следует быть осторожным при установке новых зависимостей. Ничто не мешает вам установить Playwright в образ actor-node-puppeteer-chrome
, но итоговый образ будет примерно в 3 раза больше и крайне медленным для загрузки и сборки.
Используя только необходимое, вы получите разумное время сборки и запуска.
Образы Docker от Apify
actor-node
Это наш самый маленький образ на базе Alpine Linux. Он не включает браузеры и поэтому лучше всего подходит для работы с CheerioCrawler
. Его преимущество - молниеносная сборка и запуск контейнеров.
PuppeteerCrawler
, PlaywrightCrawler
и другие функции, основанные на браузере, НЕ будут работать с этим образом.
FROM apify/actor-node:20
actor-node-puppeteer-chrome
Этот образ включает Puppeteer (Chromium) и браузер Chrome. Его можно использовать с CheerioCrawler
и PuppeteerCrawler
, но НЕ с PlaywrightCrawler
.
Образ по умолчанию поддерживает XVFB, поэтому вы можете запускать браузеры как в режиме headless
, так и в режиме headful
.
FROM apify/actor-node-puppeteer-chrome:20
actor-node-playwright
Очень большой и медленный образ, который может запускать все браузеры Playwright: Chromium, Chrome, Firefox, WebKit. Установлено всё необходимое. Если вам нужно разрабатывать или тестировать с несколькими браузерами, это ваш выбор, но в большинстве случаев лучше использовать специализированные образы, описанные ниже.
FROM apify/actor-node-playwright:20
actor-node-playwright-chrome
Аналогичен actor-node-puppeteer-chrome
, но для Playwright. Вы можете использовать CheerioCrawler
и PlaywrightCrawler
, но НЕ PuppeteerCrawler
.
Использует переменную окружения PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD
для блокировки установки дополнительных браузеров, чтобы сохранить небольшой размер образа. Если вам нужны дополнительные браузеры, используйте образ actor-node-playwright
или переопределите эту переменную окружения.
Образ поддерживает XVFB по умолчанию, поэтому можно запускать браузеры как в режиме headless
, так и headful
.
FROM apify/actor-node-playwright-chrome:20
actor-node-playwright-firefox
То же самое, что и actor-node-playwright-chrome
, но с предустановленным Firefox.
FROM apify/actor-node-playwright-firefox:20
actor-node-playwright-webkit
То же самое, что и actor-node-playwright-chrome
, но с предустановленным WebKit.
FROM apify/actor-node-playwright-webkit:20
Пример Dockerfile
Для использования вышеуказанных образов необходим Dockerfile
. Вы можете использовать этот пример или создать проект с помощью Crawlee CLI, который автоматически добавит правильный Dockerfile в папку вашего проекта.
- Node+JavaScript
- Node+TypeScript
- Browser+JavaScript
- Browser+TypeScript
# Указываем базовый Docker-образ. Подробнее о доступных
# образах можно узнать на https://crawlee.dev/docs/guides/docker-images
# Также можно использовать любой другой образ из Docker Hub.
FROM apify/actor-node:20
# Копируем только package.json и package-lock.json
# для ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем NPM-пакеты, пропускаем опциональные и зависимости для разработки,
# чтобы сохранить минимальный размер образа. Минимизируем вывод логов и
# выводим дерево зависимостей для отладки
RUN npm --quiet set progress=false \
&& npm install --omit=dev --omit=optional \
&& echo "Установленные NPM-пакеты:" \
&& (npm list --omit=dev --all || true) \
&& echo "Версия Node.js:" \
&& node --version \
&& echo "Версия NPM:" \
&& npm --version
# Затем копируем оставшиеся файлы и каталоги с исходным кодом.
# Так как мы делаем это после установки NPM, быстрая сборка будет
# действительно быстрой для большинства изменений в исходных файлах.
COPY . ./
# Запускаем образ.
CMD npm start --silent
# Указываем базовый образ Docker. Подробнее о доступных образах
# можно прочитать на https://crawlee.dev/docs/guides/docker-images
# Также можно использовать любой другой образ из Docker Hub.
FROM apify/actor-node:20 AS builder
# Копируем только package.json и package-lock.json
# для ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем все зависимости. Пропускаем аудит для ускорения установки.
RUN npm install --include=dev --audit=false
# Копируем исходные файлы, используя пользователя,
# установленного в базовом образе.
COPY . ./
# Устанавливаем все зависимости и собираем проект.
# Пропускаем аудит для ускорения установки.
RUN npm run build
# Создаем финальный образ
FROM apify/actor-node:20
# Копируем только собранные JS файлы из образа builder
COPY /usr/src/app/dist ./dist
# Копируем только package.json и package-lock.json
# для ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем NPM пакеты, пропускаем опциональные и зависимости для разработки,
# чтобы сохранить образ компактным. Минимизируем логирование и выводим
# дерево зависимостей для отладки
RUN npm --quiet set progress=false \
&& npm install --omit=dev --omit=optional \
&& echo "Установленные NPM пакеты:" \
&& (npm list --omit=dev --all || true) \
&& echo "Версия Node.js:" \
&& node --version \
&& echo "Версия NPM:" \
&& npm --version
# Копируем оставшиеся файлы и директории с исходным кодом.
# Так как мы делаем это после установки NPM, быстрая сборка будет действительно
# быстрой для большинства изменений в исходных файлах.
COPY . ./
# Запускаем образ.
CMD npm run start:prod --silent
Этот пример для Playwright. Если вы хотите использовать Puppeteer, просто замените playwright
на puppeteer в объявлении FROM
.
# Указываем базовый Docker-образ. Подробнее о доступных
# образах можно узнать на https://crawlee.dev/docs/guides/docker-images
# Также можно использовать любой другой образ из Docker Hub.
FROM apify/actor-node-playwright-chrome:20
# Копируем только package.json и package-lock.json
# для ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем NPM-пакеты, пропускаем опциональные и зависимости для разработки,
# чтобы сохранить минимальный размер образа. Минимизируем вывод логов и выводим
# дерево зависимостей для отладки
RUN npm --quiet set progress=false \
&& npm install --omit=dev --omit=optional \
&& echo "Установленные NPM-пакеты:" \
&& (npm list --omit=dev --all || true) \
&& echo "Версия Node.js:" \
&& node --version \
&& echo "Версия NPM:" \
&& npm --version
# Затем копируем оставшиеся файлы и каталоги с исходным кодом.
# Так как мы делаем это после установки NPM, быстрая сборка будет действительно
# быстрой для большинства изменений в исходных файлах.
COPY . ./
# Запускаем образ.
CMD npm start --silent
Этот пример для Playwright. Если вы хотите использовать Puppeteer, просто замените playwright
на puppeteer в обоих объявлениях FROM
.
# Указываем базовый образ Docker. Подробнее о доступных
# образах можно узнать на https://crawlee.dev/docs/guides/docker-images
# Также можно использовать любой другой образ из Docker Hub.
FROM apify/actor-node-playwright-chrome:20 AS builder
# Копируем только package.json и package-lock.json для
# ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем все зависимости. Пропускаем аудит для ускорения установки.
RUN npm install --include=dev --audit=false
# Копируем исходные файлы, используя пользователя,
# установленного в базовом образе.
COPY . ./
# Устанавливаем все зависимости и собираем проект.
# Пропускаем аудит для ускорения установки.
RUN npm run build
# Создаем финальный образ
FROM apify/actor-node-playwright-chrome:20
# Копируем только собранные JS файлы из образа builder
COPY /home/myuser/dist ./dist
# Копируем только package.json и package-lock.json для
# ускорения сборки с использованием кэша слоев Docker.
COPY package*.json ./
# Устанавливаем NPM пакеты, пропускаем опциональные и dev-зависимости
# для уменьшения размера образа. Минимизируем логирование и выводим
# дерево зависимостей для отладки
RUN npm --quiet set progress=false \
&& npm install --omit=dev --omit=optional \
&& echo "Установленные NPM пакеты:" \
&& (npm list --omit=dev --all || true) \
&& echo "Версия Node.js:" \
&& node --version \
&& echo "Версия NPM:" \
&& npm --version
# Копируем оставшиеся файлы и директории с исходным кодом.
# Так как это делается после установки NPM, быстрая сборка будет
# действительно быстрой для большинства изменений в исходных файлах.
COPY . ./
# Запускаем образ. Если вы знаете, что не будете использовать браузер
# в режиме с графическим интерфейсом, можно удалить скрипт запуска XVFB
# для небольшого прироста производительности.
CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent