Ogłoszono, że Java 11 będzie najnowszą wersją LTS. Więc staramy się uruchomić nowe usługi w oparciu o tę wersję Java.
Jednak podstawowy obraz platformy Docker dla języka Java 11 jest znacznie większy niż jego odpowiednik dla języka Java 8:
openjdk:8-jre-alpine
: 84 MBopenjdk:11-jre-slim
: 283 MB
(Zastanawiam tylko oficjalnego OpenJDK oraz Najlżejszy obrazy dla każdej wersji Java).
Głębsze kopanie pozwoliło odkryć następujące „rzeczy”:
openjdk:11-jre-slim
obrazu wykorzystuje obraz bazowejdebian:sid-slim
. Powoduje to 2 problemy:jest to 60 MB większe niż
alpine:3.8
że Debian
sid
wersje są niestabilne
openjdk-11-jre-headless
pakiet zainstalowany w obrazie jest 3 razy większa niżopenjdk8-jre
(wewnątrz pojemnika działa Docker)openjdk:8-jre-alpine
:/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
openjdk:11-jre-slim
:# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
Idąc głębiej, odkryłem „źródło” tego ciężaru - to
modules
plik JDK:# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
A teraz pojawiły się pytania:
Dlaczego
alpine
nie jest już używany jako obraz podstawowy dla smukłych obrazów Java 11?Dlaczego niestabilna wersja sid jest używana dla obrazów LTS Java?
Dlaczego pakiet slim / headless / JRE dla OpenJDK 11 jest tak duży w porównaniu z podobnym pakietem OpenJDK 8?
- Co to za plik modułów , który daje 135 MB w OpenJDK 11?
UPD : jako rozwiązanie tych wyzwań można by użyć następującej odpowiedzi: aplikacja Java 11 jako obraz dockera
Odpowiedzi:
To dlatego, że niestety nie ma obecnie oficjalnej stabilnej wersji OpenJDK 11 dla Alpine.
Alpine używa musl libc, w przeciwieństwie do standardowego glibc używanego przez większość Linuksów, co oznacza, że JVM musi być kompatybilny z musl libc, aby wspierać waniliowy Alpine. Musl port OpenJDK jest rozwijany w ramach projektu Portola OpenJDK .
Aktualny stan podsumowano na stronie OpenJDK 11 :
Jedyne stabilne wersje OpenJDK dla Alpine to obecnie 7 i 8, dostarczone przez projekt IcedTea .
Jeśli jednak chcesz rozważyć inne rozwiązanie niż oficjalny OpenJDK, Zulu OpenJDK firmy Azul oferuje atrakcyjną alternatywę:
Aby uzyskać informacje o dostępności pomocy technicznej i harmonogramie, zobacz plan pomocy technicznej firmy Azul .
Aktualizacja, 06.03.19: Od wczoraj
openjdk11
jest dostępna w repozytoriach Alpine! Można go było złapać na Alpine za pomocą:Pakiet jest oparty na
jdk11u
gałęzi OpenJDK plus przeniesione poprawki z projektu Portola, wprowadzone z następującym PR . Uznanie i wielkie podziękowania dla zespołu Alpine.To uczciwe pytanie / prośba. W rzeczywistości istnieje otwarte zgłoszenie do udostępnienia Java 11 w stabilnej wersji Debiana:
https://github.com/docker-library/openjdk/issues/237
Aktualizacja, 26.12.18: Problem został rozwiązany, a teraz szczupły obraz OpenJDK 11 jest oparty na
stretch-backports
OpenJDK 11, który został niedawno udostępniony ( link PR ).Java 9 wprowadziła system modułów, który jest nowym i ulepszonym podejściem do grupowania pakietów i zasobów w porównaniu z plikami jar. Ten artykuł firmy Oracle zawiera bardzo szczegółowe wprowadzenie do tej funkcji:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html
modules
Plik łączy wszystkie moduły dostarczane wraz z JRE. Pełną listę modułów można wydrukować za pomocąjava --list-modules
.modules
jest rzeczywiście bardzo dużym plikiem i jak skomentowano, zawiera wszystkie standardowe moduły i dlatego jest dość rozdęty.Należy jednak zauważyć, że zastępuje
rt.jar
itools.jar
stał się przestarzały, między innymi, więc biorąc pod uwagę rozmiar wmodules
porównaniu do kompilacji OpenJDK starszych niż 9, rozmiaryrt.jar
itools.jar
powinny zostać odjęte (powinny zajmować około 80 MB łącznie) .źródło
od 07.2019 https://adoptopenjdk.net/ ma oficjalne wsparcie Alpine dla Java 11:
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/alpine/
https://hub.docker.com/r/adoptopenjdk/openjdk11
Jednak moduły ( jmods ,
jlink
) nadal uważa się, gdy jeden montuje minimalny aplikacji.Uwaga : szczupłe obrazy nie zawierają niektórych modułów (takich jak
java.sql
) - są one wyraźnie wykluczone ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/s-java.sh#L2lim )źródło
https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.7-jre-slim
w repozytorium docker openjdk obraz slim jre 11 ma mniej niż 70 MB
źródło