在具有Windows / ServerCore的Windows容器上以无头模式运行Firefox

时间:2019-04-12 17:19:17

标签: docker firefox webdriver server-core windows-server-container

为了提供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

现在,一旦启动容器,WebDriver中生成的geckodriver的响应(在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会导致执行tasklist后出现firefox.exe进程,但这只是占用6MB RAM的一个进程(与Chrome不同,Chrome产生了数十个进程,并且在Windows中没有问题无头运行,与Windows 10上执行的Firefox相同)。我认为存在某种阻碍打开Firefox的障碍,并且由于Server Core没有GUI,因此无法显示和诊断它。遗憾的是,我没有找到有关存储在磁盘上的Firefox日志的任何信息,也没有从命令行以更详细的模式运行Firefox。我已经尝试过的东西:

  • 将Firefox更改为32位
  • 各种Firefox版本
  • Install subset of DirectX
  • 安装没有巧克力味的Firefox
  • 各种Windows Server Core版本

总而言之,即使不可能(但是为什么?Chrome可以做到),我想知道实际的错误是什么,失败的原因是什么。 Firefox本身提供的更多详细信息也很方便。

我知道最简单的方法是切换到Linux,但是长话短说,目前尚不可能。

版本:

  • Docker:18.09.2,内部版本6247962
  • Firefox:66.0.3
  • GeckoDriver:0.24.0

1 个答案:

答案 0 :(得分:0)

我认为您正在耗尽共享内存(没有发现如何运行docker,而是在猜测)。问题是geckodriver阻塞了共享内存。原因尚未完全了解yet。您有两个选择。挂载共享内存或设置固定大小。

如果要设置修复大小,请使用--shm-size(共享内存大小)开关进行设置。您必须将其至少设置为ShmSize: 1800000000(1.8g)。通常为简单起见,将其设置为2G:

--shm-size 2g

如果您查看github文档running images,甚至可以看到以下警告:

  

❗️在执行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设置为about: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