Пример работы с Selenium в Docker¶
При развертывании Selenium в контейнерах Docker важно учитывать архитектуру хоста, требования к функциональности и производительность. Официальные образы selenium/standalone-* предназначены для процессоров AMD64 (x86_64), в то время как seleniarm/standalone-* адаптированы для ARM-архитектур, таких как процессоры Apple silicon и серверные ARM64-процессоры.
Сперва создадим файл docker-compose.yml в корне проекта. Он будет содержать два сервиса:
docker-compose.yml
version: "3"
services:
app:
build: .
restart: always
volumes:
- .:/app
depends_on:
- selenium
platform: linux/amd64
selenium:
image: selenium/standalone-chromium:latest # Для AMD64
# image: seleniarm/standalone-chromium:latest # Для ARM64
container_name: selenium-container
restart: unless-stopped
shm_size: 2g
ports:
- "4444:4444" # Selenium WebDriver API
- "7900:7900" # VNC Viewer
environment:
- SE_NODE_MAX_SESSIONS=1
- SE_NODE_OVERRIDE_MAX_SESSIONS=true
- SE_NODE_SESSION_TIMEOUT=300
- SE_NODE_GRID_URL=http://localhost:4444
- SE_NODE_DETECT_DRIVERS=false
Обратите внимание, что в предложенном примере файла нужно самостоятельно выбрать образ в зависимости от архитектуры системы и раскомментировать требуемую строку.
Сервис app будет использоваться для исполнения основного Python-кода. Пропишем стандартный Dockerfile для этого сервиса:
Dockerfile
# Используем минимальный образ Python
FROM python:3.11-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Устанавливаем зависимости Python
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Копируем файлы проекта
COPY . /app/
# Переменные окружения (Chromium уже в другом контейнере)
ENV SELENIUM_REMOTE_URL="http://selenium:4444/wd/hub"
# Запускаем Python-скрипт
CMD ["python", "main.py"]
Этот Dockerfile использует образ Python и автоматически устанавливает зависимости.
Далее пропишем скрипт с инициализацией драйвера в main.py:
import time # Используем для создания задержки при проверке работоспособности браузера
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# Настройки для WebDriver
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-webrtc")
chrome_options.add_argument("--hide-scrollbars")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--start-maximized")
SELENIUM_REMOTE_URL = os.getenv("SELENIUM_REMOTE_URL", "http://selenium:4444/wd/hub")
driver = webdriver.Remote(
command_executor=SELENIUM_REMOTE_URL,
options=chrome_options
)
# Открываем тестовую страницу
driver.get("https://www.timeweb.cloud")
time.sleep(9999)
# Завершаем работу WebDriver
driver.quit()
В файле requirements.txt можно прописать стандартный пакет зависимостей, устанавливаемый вместе с Selenium:
attrs==25.1.0
certifi==2025.1.31
h11==0.14.0
idna==3.10
outcome==1.3.0.post0
PySocks==1.7.1
selenium==4.28.1
sniffio==1.3.1
sortedcontainers==2.4.0
trio==0.28.0
trio-websocket==0.11.1
typing_extensions==4.12.2
urllib3==2.3.0
websocket-client==1.8.0
wsproto==1.2.0
Теперь можно запустить контейнеры:
docker compose up -d
links: