我需要打包一个处理REST API调用的Scala应用程序,并在某些情况下借助Selenium WebDriver启动FireFox浏览器。我使用 sbt-native-packager ,因为它既方便又简单。作为基本映像,我使用自己的Dockerfile:
# https://hub.docker.com/_/debian
FROM openjdk:8-jre-alpine3.9
ARG firefox_ver=70.0
ARG geckodriver_ver=0.26.0
# Download and install deps
RUN apk update && apk add curl curl-dev
# Download and install Firefox
RUN curl -fL -o /tmp/firefox.tar.bz2 https://ftp.mozilla.org/pub/firefox/releases/${firefox_ver}/linux-x86_64/en-GB/firefox-${firefox_ver}.tar.bz2 \
&& tar -xjf /tmp/firefox.tar.bz2 -C /tmp/ && mv /tmp/firefox /usr/local/bin/
# Download and install geckodriver
RUN curl -fL -o /tmp/geckodriver.tar.gz \
https://github.com/mozilla/geckodriver/releases/download/v${geckodriver_ver}/geckodriver-v${geckodriver_ver}-linux64.tar.gz \
&& tar -xzf /tmp/geckodriver.tar.gz -C /tmp/ && chmod +x /tmp/geckodriver && mv /tmp/geckodriver /usr/local/bin/
ENV PATH="/usr/local/bin/firefox:${PATH}"
然后在build.sbt
中,我使用以下命令来提供对firefox
二进制文件的适当访问级别:
...
dockerAdditionalPermissions += (DockerChmodType.UserGroupPlusExecute, "/usr/local/bin/firefox/firefox")
...
但是不幸的是,当我连接到正在运行的docker容器并尝试调用firefox
时,我得到了:
/opt/docker $ firefox
sh: firefox: Permission denied
结果,Scala应用程序也无法启动FireFox:(
这是firefox
的许可:
-rwxr-xr-x 1 root root 14656 Oct 16 17:55 firefox
答案 0 :(得分:2)
您似乎无法在Alpine上运行(此版本的)firefox:
# ldd firefox
/lib64/ld-linux-x86-64.so.2 (0x7fcc15ef4000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fcc15ef4000)
libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7fcc15ef4000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fcc15d9f000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcc15ef4000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fcc15d8b000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fcc15ef4000)
Error relocating firefox: __fprintf_chk: symbol not found
这似乎是由于Alpine基于musl而非GNU libc引起的。
要变通,可以使用Alpine本身提供的firefox软件包(但您仍然需要geckodriver来工作)...或者,切换到非高山Docker映像。