允许Alpine在ARM64 arch上不执行musl Java 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

我的目标是使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

    使用jlink工具将OpenJRE 10文件夹和缩小的模块列表复制到Apline映像中

    不幸的是,当我尝试运行./java--version时,我发现

    /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 compat
    etc
    lib
    下有to文件夹,再次感谢valiano,让我在arm64上尝试同样的方法Archi valiano,我尝试了你建议的方法,我成功地在arm64上重新编译了glibc源代码,根据Apline软件包创建指南创建apk文件。最后,我用running
    ldconfig
    将其添加到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的结果