Запуск Firefox в автономном режиме на контейнере Windows с Windows/ ServerCore

Чтобы предоставить Windows Selenium WebDriver Grid, я начал подготовку Dockerfile, который позволил бы выполнять роль узла сетки. Первоначальной причиной было подготовить изображение с управляемой версией Firefox/GeckoDriver. Воодушевленный успешной подготовкой образа Chrome с той же целью, я начал со следующего Dockerfile:

FROM mcr.microsoft.com/windows/servercore:1809

# Install chocolatey
RUN @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
RUN choco feature enable -n allowGlobalConfirmation

WORKDIR C:\\tools

# Set driver/browser versions
ARG Selenium_Major_Version="3.141"
ARG Selenium_Version="3.141.59"

ARG GeckoDriver_Version="0.24.0"
ARG Firefox_Version="66.0.3"

# Install Java
RUN choco install jdk8

# Download Selenium
RUN powershell Invoke-WebRequest \
    -Uri "https://selenium-release.storage.googleapis.com/$env:Selenium_Major_Version/selenium-server-standalone-$env:Selenium_Version.jar" \
    -OutFile ".\\selenium-server-standalone.jar"

# Install Firefox
RUN choco install firefox --version %Firefox_Version%

COPY config.json .

ENTRYPOINT java \
    -Dwebdriver.gecko.driver=C:\\tools\\geckodriver.exe \
    -jar selenium-server-standalone.jar \
    -role node \
    -nodeConfig config.json

Теперь, когда контейнер запущен, ответ от порожденного geckodriver в WebDriver (выполняется с журналами на уровне TRACE) висит на:

node_1  | 1555088898615 mozrunner::runner       INFO    Running command: "C:\\Program Files\\Mozilla Firefox\\firefox.exe" "-marionette" "--headless" "-foreground" "-no-remote" "-profile" "C:\\Users\\ContainerAdministrator\\AppData\\Local\\Temp\\rust_mozprofile.SfT4FwVW8T8s"
node_1  | 1555088898631 geckodriver::marionette DEBUG   Waiting 60s to connect to browser on 127.0.0.1:49171
node_1  | 1555088959727 mozrunner::runner       DEBUG   Killing process 1252
node_1  | 1555088959727 webdriver::server       DEBUG   <- 500 Internal Server Error {"value":{"error":"unknown error","message":"connection refused","stacktrace":""}}

Таким образом, дело в том, что Firefox запускается неправильно, поскольку GeckoDriver мог его порождать, но не взаимодействовать с ним. Более того, запуск firefox.exe непосредственно в контейнере приводит к появлению процесса firefox.exe, как только tasklist выполняется, но это всего лишь один процесс, занимающий 6 МБ ОЗУ (в отличие от Chrome, который порождает десятки процессов и не имеет проблем с запуском в автономном режиме, как для Firefox, выполняемого в Windows 10). Я предполагаю, что существует какое-то препятствие, мешающее открытию Firefox, и, поскольку у Server Core нет графического интерфейса, его нельзя отобразить и не диагностировать. К сожалению, я не нашел никакой информации о журналах Firefox, хранящихся на диске, и не запускаю Firefox в более подробном режиме из командной строки. Вещи, которые я уже пробовал:

Подводя итог, даже если это невозможно (но почему? Это было возможно с Chrome), я хотел бы знать, что является настоящей ошибкой и в чем причина отказа. Более подробная информация из самого Firefox также будет полезна.

Я знаю, что самый простой способ сделать это - перейти на Linux, но, если коротко, в настоящий момент это невозможно.

Версии:

  • Докер: 18.09.2, сборка 6247962
  • Firefox: 66.0.3
  • GeckoDriver: 0.24.0

1 ответ

Я думаю, что вы исчерпали свою общую память (не видел, как вы запускаете докер, но угадал). Проблема в том, что geckodriver забивает долю памяти. Причины еще не до конца понятны. У вас есть два варианта. Смонтируйте общую память или установите фиксированный размер.

Если вы хотите установить фиксированный размер, вы делаете это с помощью --shm-size (размер общей памяти) переключатель. Вы должны установить его как минимум ShmSize: 1800000000 (1,8 г). Обычно для простоты он установлен в 2G:

--shm-size 2g

Если вы проверите github docs с запущенными изображениями, вы даже увидите это предупреждение:

❗️ При выполнении запуска Docker для образа с Chrome или Firefox, пожалуйста, либо смонтируйте -v /dev/shm:/dev/shm, либо используйте флаг --shm-size=2g, чтобы использовать общую память хоста.

Для Firefox это будет:

$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-firefox:3.141.59-mercury
OR
$ docker run -d -p 4444:4444 --shm-size 2g selenium/standalone-firefox:3.141.59-mercury

Некоторые сообщают, что даже повышение лимита не помогло. Если это будет ваш случай, вы можете взломать about:config

Цитировать:

Я смог обойти эту проблему, закрыв вкладки перед выходом из главной вкладки. Также установите URL-адрес около:config/blank перед закрытием,

while (this.WindowHandles.Count > 1)
{
    this.Navigate().GoToUrl("about:config");
    this.Navigate().GoToUrl("about:blank");
    this.Close(); //Close Tab
    this.SwitchTo().Window(this.WindowHandles.Last());
}
this.Navigate().GoToUrl("about:config");
this.Navigate().GoToUrl("about:blank");
this.Quit(); //Then main window
Другие вопросы по тегам