Java 应用程序的 Docker 图像中的 Selenium

Selenium inside Docker image for Java application

我开发了 Java 应用程序来使用 Selenium 完成一些小的网络抓取任务。 它在我的本地环境中工作正常 Windows 10 和 chrome / FireFox 最新版本配置了适当的驱动程序路径。

问题是我需要将我的应用程序放在容器中才能部署它,但我遇到了问题。 我已经创建了一个基于Alpine的Dockerfile,并安装了需要安装的东西(通过互联网上找到的一些帖子帮助)。使用 FireFox 驱动程序,它在第一次操作时几乎可以正常工作,但有些与我在本地配置中的工作方式不同,有些甚至使客户端崩溃……这就是为什么我尝试使用铬,但我有一些与浏览器的连接问题甚至无法正常工作。

我已经花了好几个小时在这上面,开始想也许我遗漏了什么,我是否应该通过在我的 Dockerfile 中下载浏览器和驱动程序来做到这一点?

现在我假设 FireFox 或相关的 geckodriver 的版本与我在我的机器上的版本不同,当浏览器在容器内工作时,我只能看到我添加的日志。

Dockerfile(FireFox浏览器试试):

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

# 
# Get all the prereqs
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-bin-2.34-r0.apk
RUN apk add glibc-2.34-r0.apk
RUN apk add glibc-bin-2.34-r0.apk

# And of course we need Firefox if we actually want to *use* GeckoDriver
RUN apk add firefox-esr=60.9.0-r0

# Then install GeckoDriver
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz
RUN tar -zxf geckodriver-v0.29.1-linux64.tar.gz -C /usr/bin

ENTRYPOINT ["java","-jar","/app.jar"]

Dockerfile(对于 Chrome 浏览器尝试,我知道可能会进行优化):

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

RUN apk update && apk add --no-cache bash \
    alsa-lib \
    at-spi2-atk \
    atk \
    cairo \
    cups-libs \
    dbus-libs \
    eudev-libs \
    expat \
    flac \
    gdk-pixbuf \
    glib \
    libgcc \
    libjpeg-turbo \
    libpng \
    libwebp \
    libx11 \
    libxcomposite \
    libxdamage \
    libxext \
    libxfixes \
    tzdata \
    libexif \
    udev \
    xvfb \
    zlib-dev \
    chromium \
    chromium-chromedriver

ENTRYPOINT ["java","-jar","/app.jar"]

也许我应该使用像 https://hub.docker.com/r/selenium/standalone-firefox 这样的 docker 图像,然后手动安装 Java?

我对无法在容器内重现我的本地行为感到非常沮丧,我非常感谢这方面的帮助!我不想放弃:)

事实上,Jortega 我的图像基于 selenium 图像:https://hub.docker.com/r/selenium/standalone-firefox

这是我的 Dockerfile

FROM selenium/standalone-firefox:91.0-20210823
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

# Spring boot entrypoint
ENTRYPOINT ["java","-jar","/app.jar"]

在我的 Java 应用程序中,这里是 FireFox 配置:

// webBrowserDriverPath is a env variable set to "/usr/bin/geckodriver"
System.setProperty("webdriver.gecko.driver", webBrowserDriverPath);
final FirefoxOptions options = new FirefoxOptions();
options.addArguments(
            "--no-sandbox",
            "--disable-extensions",
            "--disable-gpu",
            "--window-size=1920,1200",
            "--ignore-certificate-errors",
            "--whitelisted-ips=''",
            "--disable-dev-shm-usage",
            "--window-size=1920,1080",
            "--lang=fr");
// display browser in dev mode
if (conf.isHeadlessModeEnabled()) {
    options.addArguments("--headless");
}
options.addPreference("intl.accept_languages", "fr");
this.remoteWebDriver = new FirefoxDriver(options);

一切正常!

我正在为我的自动化使用这个 docker 设置,工作正常。 link

我正在使用以下选项,

options.addArguments(Arrays.asList("--window-position=0,0"));
options.addArguments(Arrays.asList("--window-size=1840,1080"));
driver = new RemoteWebDriver(new URL(hub), options);

您的 Chromium dockerfile(不是 chrome)是正确的。 您必须添加 java 代码:

chromeOptions.setBinary("/usr/bin/chromium-browser");

我也有工作版本:jdk 11 (ubuntu) + chrome(对于硒):

# on ubuntu
FROM azul/zulu-openjdk:11

RUN apt-get update && apt-get install -y \
gnupg2 \
wget \
less \
&& rm -rf /var/lib/apt/lists/*

#######################
# Google Chrome

# Adding trusting keys to apt for repositories
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | 
apt-key add -
# Adding Google Chrome to the repositories
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ 
stable main" >> /etc/apt/sources.list.d/google-chrome.list'
# Updating apt to see and install Google Chrome
RUN apt-get -y update
# Magic happens
RUN apt-get install -y google-chrome-stable
# Installing Unzip
RUN apt-get install -yqq unzip


#######################
# Google Chrome Driver - now i have driver in my java app (i need both 
java app version on docker and non-docker)

# Download the Chrome Driver
#RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | 
apt-key add -
#RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ 
stable main" >> /etc/apt/sources.list.d/google-chrome.list'
#RUN apt-get -y update
#RUN apt-get install -y google-chrome-stable
# install chromedriver
#RUN apt-get install -yqq unzip
#RUN wget -O /tmp/chromedriver.zip 
http://chromedriver.storage.googleapis.com/`curl -sS 
 chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
#RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

#######################

RUN apt-get update


# Set display port as an environment variable
ENV DISPLAY=:99


ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} bot-app.jar
ENTRYPOINT ["java","-jar","/bot-app.jar"]

它工作正常。