如何使用 sbt-native-packager 在 Docker 中使二进制文件可执行?

Posted

技术标签:

【中文标题】如何使用 sbt-native-packager 在 Docker 中使二进制文件可执行?【英文标题】:How to make a binary file executable in Docker with sbt-native-packager? 【发布时间】:2020-03-25 09:55:20 【问题描述】:

我需要打包一个处理 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

【问题讨论】:

【参考方案1】:

您似乎无法在 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 映像。

【讨论】:

以上是关于如何使用 sbt-native-packager 在 Docker 中使二进制文件可执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sbt-native-packager 设置 docker 镜像名称

如何使用 sbt-native-packager 创建基本项目设置

如何使用 sbt-native-packager 更改通用 zip 文件名

如何使用 sbt-native-packager 创建 Upstart Zip 包?

如何使用 sbt-native-packager 在 Docker 中使二进制文件可执行?

如何在运行时为使用 sbt-native-packager 捆绑的应用程序加载配置文件