Java 11 base Docker görüntüsü neden bu kadar büyük? (OpenJDK: 11-JRE ince)


145

Java 11'in en son LTS versiyonu olduğu duyuruldu. Bu nedenle, bu Java sürümüne dayalı yeni hizmetler başlatmaya çalışıyoruz.

Ancak, Java 11 için temel Docker görüntüsü Java 8 ile eşdeğerden çok daha büyüktür:

( Her Java sürümü için yalnızca resmi OpenJDK ve en hafif görüntüleri düşünüyorum.)

Daha derin kazma şu "şeyleri" ortaya çıkardı:

  • openjdk:11-jre-slimgörüntü temel görüntüsünü kullanır debian:sid-slim. Bu 2 konu getiriyor:

    • bu 60 MB'den daha büyük alpine:3.8

    • Debiansid sürümleri kararsız

  • openjdk-11-jre-headlessresimde yüklü olan paket 3 kat daha büyüktür openjdk8-jre(çalışan Docker konteynerinin içinde):

    • 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/

      Daha derine inmek, bu ağırlığın "kökünü" keşfettim - JDK'nın modulesdosyası:

      # ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
      135M    /usr/lib/jvm/java-11-openjdk-amd64/lib/modules

Şimdi, gelen sorular:

  • alpineJava 11 ince görüntüleri için neden artık temel görüntü olarak kullanılmıyor?

  • Dengesiz sid sürümü neden LTS Java görüntüleri için kullanılıyor?

  • OpenJDK 11 için ince / başsız / JRE paketi neden benzer OpenJDK 8 paketine kıyasla bu kadar büyük?

    • OpenJDK 11'de 135 MB getiren bu modüller dosyası nedir ?

UPD : Bu zorluklara bir çözüm olarak bu cevap kullanılabilir: docker görüntüsü olarak Java 11 uygulaması


1
Java'nın bir yeni sürümü (JDK 9+) için modülerleştirilmiştir , bu da 11'e 8'de neden modül olduğunu açıklar.
Zachary Craig


13
JRE 11 yoktur, yani sahip olduğunuz şey tam bir JDK'dır. JRE 8'den bile daha ince olan kompakt ortamlar oluşturabilirsiniz, ancak bağımlılıkların bilinmesi için gerçek bir modüler uygulama gerektirir.
Holger

1
Yukarıdakilere ek olarak, boyutunuzdaki artışın nedeni olarak bulduğunuz tüm modüller aslında uygulamalarınız için gerekli değildir. Ancak hangilerini modüler bir uygulama oluşturmak için ilerleyeceğinizi bulmak için. Bu uğruna jlink ( Java9'da tanıtıldı) hakkında daha fazla bilgi edinebilirsiniz .
Naman

1
Bunu çevrimiçi okumak için daha iyi bir zaman olabilir - twitter.com/LogicTheoryIO/status/1064503559071371265
Naman

Yanıtlar:


172

alpineJava 11 ince görüntüleri için neden artık temel görüntü olarak kullanılmıyor?

Çünkü ne yazık ki şu anda Alpine için resmi istikrarlı bir OpenJDK 11 inşa edilmedi.

Alpine, çoğu Linux tarafından kullanılan standart glibc'in aksine musl libc kullanır, bu da bir JVM'nin vanilya Alpine'yi desteklemek için musl libc ile uyumlu olması gerektiği anlamına gelir. Musl OpenJDK limanı OpenJDK'nın Portola projesi kapsamında geliştirilmektedir .

Mevcut durum OpenJDK 11 sayfasında özetlenmiştir :

Daha önce bu sayfada bulunan Alpine Linux derlemesi JDK 11 GA'dan kaldırılmıştır. Üretime hazır değil çünkü bir GA derlemesi olarak kabul edilecek kadar kapsamlı bir şekilde test edilmedi. Lütfen yerine erken erişimli JDK 12 Alpine Linux derlemesini kullanın.

Şu anda Alpine için tek kararlı OpenJDK sürümleri, IcedTea projesi tarafından sağlanan 7 ve 8'dir .

Ancak, resmi OpenJDK dışında düşünmeye istekliyseniz, Azul'un Zulu OpenJDK'sı cazip bir alternatif sunar:

  • Bu destekler Alp MUSL üzerinde Java 11 (yazma anda itibariyle sürümü 11.0.2);
  • OpenJDK TCK uyumluluk paketi kullanılarak doğrulanmış sertifikalı bir OpenJDK derlemesidir;
  • Ücretsiz, açık kaynak kodlu ve docker hazır ( Dockerhub ).

Destek kullanılabilirliği ve yol haritası için bkz. Azul destek yol haritası .

Güncelleme, 3/6/19: Dün itibariyle, openjdk11Alp depolarında mevcut! Aşağıdakileri kullanarak Alpine'de yakalanabilir:

apk --no-cache add openjdk11

Paket, jdk11uOpenJDK şubesine ve aşağıdaki PR ile sunulan Portola projesinden taşınan düzeltmelere dayanmaktadır . Kudos ve Alp ekibine çok teşekkürler.

Dengesiz sid sürümü neden LTS Java görüntüleri için kullanılıyor?

Bu adil bir soru / istek. Aslında istikrarlı bir Debian sürümünde Java 11'i sağlamak için açık bir bilet var:
https://github.com/docker-library/openjdk/issues/237

Güncelleme, 26/12/18: Sorun çözüldü ve şimdi OpenJDK 11 ince görüntüsü stretch-backportsyakın zamanda kullanıma sunulan OpenJDK 11'i temel alıyor ( PR bağlantısı ).

OpenJDK 11 için ince / başsız / JRE paketi neden benzer OpenJDK 8 paketine kıyasla bu kadar büyük? OpenJDK 11'de 135 MB getiren bu modüller dosyası nedir ?

Java 9, paket dosyaları ve kaynakları gruplandırmak için jar dosyalarına kıyasla yeni ve geliştirilmiş bir yaklaşım olan modül sistemini tanıttı. Oracle'ın bu makalesi, bu özelliğe çok ayrıntılı bir giriş sağlar:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html

modulesDosya JRE sevk tüm modülleri demetleri. Modüllerin tam listesi ile yazdırılabilir java --list-modules. modulesgerçekten çok büyük bir dosyadır ve yorumlandığı gibi tüm standart modülleri içerir ve bu nedenle oldukça şişirilmiştir.

Bununla birlikte, dikkat edilmesi gereken bir şey , diğer şeylerin yanı sıra onun yerini alan rt.jarve tools.jarkullanımdan kaldırılmış olmasıdır, bu nedenle modules9 öncesi OpenJDK derlemeleriyle karşılaştırıldığında boyutu hesaplanırken, boyutları çıkartılmalı rt.jarve tools.jarçıkarılmalıdır (bir miktar 80MB almalıdır) .


9

07.2019 için https://adoptopenjdk.net/ Java 11 için resmi Alp desteğine sahiptir:

Ancak, modüller ( jmods ,jlink ), yine de bir adet birarada monte edilmiş en az bir uygulama kabul edilir.

Not : ince görüntüler bazı modüller içermez (gibi java.sql) - açıkça hariç tutulurlar ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.# )


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.