在Docker容器内使用无头镀铬来运行标准Java规范

时间:2019-06-13 16:08:16

标签: java docker google-chrome-headless getgauge

我正在尝试在docker容器中运行一套带有无头镀铬的仪表规格。

我尝试像这样设置Dockerfile:

FROM maven:latest

RUN apt-get update && apt-get install -q -y unzip curl

ENV DEBIAN_FRONTEND=noninteractive

# requirements for chrome headless
# https://github.com/Googlechrome/puppeteer/issues/290#issuecomment-322838700
RUN apt-get update && apt-get install -y gnupg &&\
curl -sL https://deb.nodesource.com/setup_11.x | bash - &&\
apt-get update && apt-get install -y nodejs make g++ &&\
apt-get update &&\
apt-get install -y git-all gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
  libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 \
  libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \
  libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates \
  fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget &&\
apt autoremove -y &&\
rm -rf /var/lib/apt/lists/*


# Install Google Chrome
RUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list && \
    apt-get -yqq update && \
    apt-get -yqq install google-chrome-stable && \
    rm -rf /var/lib/apt/lists/*

# Install gauge
RUN apt-get install unzip
RUN curl -L https://github.com/getgauge/gauge/releases/download/v1.0.5/gauge-1.0.5-linux.x86_64.zip -o /gauge-1.0.5-linux.x86_64.zip
RUN unzip -o gauge-1.0.5-linux.x86_64.zip -d /usr/local/bin

# Install gauge plugins
RUN gauge install java && \
    gauge install screenshot

ENTRYPOINT ["mvn"]

注意:在这里,我不得不删除了少量的专有内容,但这不应有所作为。

还要注意,我在其中工作的CI系统会处理很多事情,例如将卷安装到容器中,从git中获取存储库,分配端口等。

当CI系统使用此容器运行仪表规格时,它们都会失败,并显示如下错误:

 INFO: Created user preferences directory.
17:55:37  Starting ChromeDriver 75.0.3770.8 (681f24ea911fe754973dda2fdc6d2a2e159dd300-refs/branch-heads/3770@{#40}) on port 26120
17:55:37  Only local connections are allowed.
17:55:37  Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
17:55:37  [1560441336.946][SEVERE]: bind() failed: Cannot assign requested address (99)
17:55:37  Failed to take regular screenshot: 
17:55:37  No X11 DISPLAY variable was set, but this program performed an operation which requires it.
17:55:37  Failed to take regular screenshot: 
17:55:37  No X11 DISPLAY variable was set, but this program performed an operation which requires it.
17:55:37      Error Message: org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited abnormally
17:55:37        (unknown error: DevToolsActivePort file doesn't exist)
17:55:37        (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
17:55:37      Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
17:55:37      System info: host: 'dae4cd1c9fcd', ip: '10.99.0.2', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-1029-gcp', java.version: '11.0.1'
17:55:37      Driver info: driver.version: GaugeDriver
17:55:37      remote stacktrace: #0 0x562fab6bd299 <unknown>

因此,似乎无头的chrome实例甚至没有启动。但是,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

尝试将--no-sandbox选项传递给chromedriver实例。

示例:

   ChromeOptions options = new ChromeOptions();
   options.addArguments(“--no-sandbox”);
   new ChromeDriver(options);

有关更多详细信息,请参阅this问题。