Запуск 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 в более подробном режиме из командной строки. Вещи, которые я уже пробовал:
- изменить Firefox на 32-разрядный
- различные версии Firefox
- Установить подмножество DirectX
- Установите Firefox без шоколада
- различные версии Windows Server Core
Подводя итог, даже если это невозможно (но почему? Это было возможно с 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