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"]
它工作正常。
我开发了 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"]
它工作正常。