允许Alpine在ARM64 arch上不执行musl Java JRE
我的目标是使Alpine能够执行非musl支持的JRE。这背后的动机是图像大小的缩小,我在压缩JRE本身方面取得了一定的进展,但我发现的最小图像是ARM64v8/debian:slim-9和50M。这很好,但还不够。 对于支持musl的ARM64,我没有找到任何高达9的JRE。因此,可能的方向是允许Alpine在ARM64 arch上不执行musl Java JRE,java,docker,glibc,arm64,alpine,Java,Docker,Glibc,Arm64,Alpine,我的目标是使Alpine能够执行非musl支持的JRE。这背后的动机是图像大小的缩小,我在压缩JRE本身方面取得了一定的进展,但我发现的最小图像是ARM64v8/debian:slim-9和50M。这很好,但还不够。 对于支持musl的ARM64,我没有找到任何高达9的JRE。因此,可能的方向是 以阿尔卑斯山为例(约5米) 使其能够执行glibc Java代码(通过安装glibc APK) 在生成的映像上运行JRE,希望最终映像大小小于20M 以下是我的步骤: 我所有的实验都是在真正的ARM64
- 拉3.8
- 基于以下git项目 apk--无缓存添加ca证书 wget apk add——允许不受信任的glibc-2.23-r3.apk
/bin/sh: ./java: not found
我看到glibc apk已安装,添加了以下文件夹
/usr/glibc-compat/lib
我所缺少的任何想法都将受到感谢。似乎
ldconfig
是缺少的一点。运行ldconfig
将更新动态链接器的搜索路径,因此它将能够找到已安装的glibc二进制文件
要运行glibc的ldconfig
,并指向已安装的glibc:
/usr/glibc compat/sbin/ldconfig/lib/usr/glibc compat/lib
但是,您提到在/usr/glibc compat
下只有lib
和etc
文件夹glibc二进制文件位于另一个apk中,因此您需要抓取并安装:
glibc-bin-2.23-r3.apk
总而言之,我使用以下(X86)Dockerfile成功运行了glibc Java:
# Based on stripped down Docker file from:
# https://github.com/anapsix/docker-alpine-java
FROM alpine:3.8
ENV GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc
ENV GLIBC_VERSION=2.28-r0
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# do all in one step
RUN set -ex && \
apk --update add libstdc++ curl ca-certificates && \
for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION}; \
do curl -sSL ${GLIBC_REPO}/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \
apk add --allow-untrusted /tmp/*.apk && \
rm -v /tmp/*.apk && \
/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib
嗨,丹尼斯,你能发布一下ldd./java的输出吗?嗨,维利亚诺,很抱歉这么长时间的延迟,ldd./java的输出是
/work/target/jlink image/bin#ldd./java/lib/ld-linux-aarch64.so.1(0x55689ab000)libz.so.1=>/lib/libz.so.1(0x7fa0830000)libpthread.so.0=>/lib/ld-linux-aarch64.so.1(0x55689ab000)libjli.so=>./../lib/jli/libjli.so(0x7fa080f000)libdl.so.2=>/lib/ld-linux-aarch64.so.1(0x55689ab000)libc.so.6=>/lib/ld-linux-aarch64.so.1(0x55689ab000)重新定位错误。/../lib/jli/libjli/libjli.so:u rawmemechr:symbol未找到
谢谢Denis。怎么样/usr/glibc compat/bin/ldd./java
?(默认的ldd
是Alpine musl)在apk安装后,我没有看到/usr/glibc compat/bin/folder,glibc compatetc
和lib
下有to文件夹,再次感谢valiano,让我在arm64上尝试同样的方法Archi valiano,我尝试了你建议的方法,我成功地在arm64上重新编译了glibc源代码,根据Apline软件包创建指南创建apk文件。最后,我用runningldconfig
将其添加到alpine running容器中,不幸的是仍然无法运行java进程,可能我遗漏了一些东西。如果有任何想法,我将不胜感激。嗨@DenisVolohsin。您不是在使用已经构建的glibc ARM64 apk吗?首先,我想尝试一下:-不,我自己根据源代码在ARM64机器上构建它。感谢链接,当然让我看看,顺便说一句,只是为了实验,我尝试在我根据您的脚本构建的alpine映像(X86)上运行java 9和10,映像看起来不错,但只有java 8可以运行。10和9返回Java运行时环境检测到一个致命错误:
,似乎在newers Java版本中存在glibc不支持的深层次错误:(回到您的评论:您给我发送的链接是针对x86的,不是吗?我确定,我不能在ARM64上使用它,这就是为什么我创建了定制的alpine pkg glibc builer映像,然后编译了glibc源代码,并基于创建alpine apk的结果