Разрешить Alpine выполнять не-musl Java JRE на ARM64 arch - PullRequest
0 голосов
/ 16 октября 2018

Моя цель - разрешить Alpine выполнять JRE без поддержки musl.Мотивация этого заключается в минимизации размера изображения, я достиг определенного прогресса в сжатии самой JRE, но минимальное изображение, которое я нашел, это ARM64v8 / debian: slim-9 с 50M.это довольно хорошо, но недостаточно.Я не нашел ни одного JRE до 9 для ARM64 с поддержкой musl.поэтому возможное направление:

  1. Возьмите альпийское изображение (около 5 мес.)
  2. Включите его для выполнения Java-кода glibc (установив glibc APK)
  3. Запустите JRE наПолученное изображение, мы надеемся, окончательный размер изображения будет меньше 20M.

Вот мои шаги:

Все мои эксперименты я делаю на реальном оборудовании ARM64.

Скопируйте папку OpenJRE 10 со списком минимизированных модулей с помощью инструмента jlink вИзображение Apline с.

К сожалению, когда я пытаюсь запустить ./java --version, я получаю

/bin/sh: ./java: not found

Я вижу, что был установлен glibc apk, была добавлена ​​следующая папка

/usr/glibc-compat/lib

Любые идеи, которые мне не хватает, будут оценены.

1 Ответ

0 голосов
/ 18 октября 2018

Кажется, что ldconfig - недостающий бит.Запуск ldconfig обновит пути поиска динамического компоновщика, поэтому он сможет найти установленные двоичные файлы glibc.

Для запуска ldconfig glibc и указания на установленный glibc:

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

Но вы упомянули, что в папке /usr/glibc-compat.
есть только папки lib и etc. Двоичные файлы glibc находятся в другом apk, так что вынужно скачать и установить: glibc-bin-2.23-r3.apk.

Собрав все вместе, я успешно запустил glibc Java, используя следующий (X86) Dockerfile:

# 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
...