使Alpine能够在ARM64架构上执行非笨拙的Java JRE

时间:2018-10-16 06:58:30

标签: java docker glibc arm64 alpine

我的目标是使Alpine能够执行不受音乐支持的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

我看到已在以下文件夹中安装了glibc apk

/usr/glibc-compat/lib

任何我想念的想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

似乎ldconfig是缺少的部分。运行ldconfig将更新动态链接器的搜索路径,因此可以找到已安装的glibc二进制文件。

用于运行glibc的ldconfig并指向已安装的glibc:

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

但是,您已经提到lib下只有etc/usr/glibc-compat文件夹。
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