Запуск Firefox в автономном режиме на контейнере Windows с Windows / ServerCore - PullRequest
6 голосов
/ 12 апреля 2019

Для поставки 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 Ответ

0 голосов
/ 15 апреля 2019

Я думаю, что вы исчерпали свою общую память (не видел, как вы запускаете докер, но угадываете).Проблема в том, что 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
...