启用 Alpine 在 ARM64 架构上执行 not-musl Java JRE

Den*_*hin 5 java glibc docker arm64 alpine-linux

我的目标是让 Alpine 能够执行非 musl 支持的 JRE。这背后的动机是图像大小缩小,我在压缩 JRE 本身方面取得了一定的进展,但我发现的最小图像是 50M 的 ARM64v8/debian:slim-9。这相当不错,但还不够。我没有找到任何支持 musl 的适用于 ARM64 的 JRE(最高 9)。因此可能的方向是

  1. 拍摄高山影像(约5M)
  2. 使其能够执行 glibc Java 代码(通过安装 glibc APK)
  3. 对生成的镜像运行JRE,希望最终镜像大小小于20M。

这是我的步骤:

我所有的实验都是在真正的 ARM64 硬件上进行的。

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

不幸的是,当我尝试运行 ./java --version 时,我得到了

/bin/sh: ./java: not found
Run Code Online (Sandbox Code Playgroud)

我看到 glibc apk 已安装,已添加以下文件夹

/usr/glibc-compat/lib
Run Code Online (Sandbox Code Playgroud)

我所缺少的任何想法将不胜感激。

val*_*ano 1

看来这ldconfig就是缺失的一点。运行ldconfig将更新动态链接器的搜索路径,因此它将能够找到已安装的 glibc 二进制文件。

运行 glibcldconfig并指向已安装的 glibc:

/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib

但是,您提到过下只有lib和文件夹。 glibc 二进制文件位于另一个 apk 中,因此您需要获取并安装:。etc/usr/glibc-compat
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
Run Code Online (Sandbox Code Playgroud)