Den*_*hin 5 java glibc docker arm64 alpine-linux
我的目标是让 Alpine 能够执行非 musl 支持的 JRE。这背后的动机是图像大小缩小,我在压缩 JRE 本身方面取得了一定的进展,但我发现的最小图像是 50M 的 ARM64v8/debian:slim-9。这相当不错,但还不够。我没有找到任何支持 musl 的适用于 ARM64 的 JRE(最高 9)。因此可能的方向是
这是我的步骤:
我所有的实验都是在真正的 ARM64 硬件上进行的。
基于以下git项目 https://github.com/owlab-exp/alpine-pkg-glibc-arm64
apk --no-cache 添加 ca 证书
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-2.23-r3.apk
apk 添加 --allow-untrusted glibc-2.23-r3.apk
使用 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)
我所缺少的任何想法将不胜感激。
看来这ldconfig就是缺失的一点。运行ldconfig将更新动态链接器的搜索路径,因此它将能够找到已安装的 glibc 二进制文件。
运行 glibcldconfig并指向已安装的 glibc:
/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib
但是,您提到过下只有lib和文件夹。
glibc 二进制文件位于另一个 apk 中,因此您需要获取并安装:。etc/usr/glibc-compatglibc-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)