如何使用 sbt-native-packager 使二进制文件在 Docker 中可执行?
How to make a binary file executable in Docker with sbt-native-packager?
我需要打包一个处理 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
您似乎无法在 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 才能工作)...或者,切换到非 alpine Docker 图像。
我需要打包一个处理 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
您似乎无法在 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 才能工作)...或者,切换到非 alpine Docker 图像。