ทำไมอิมเมจฐาน Java 11 จึงมีขนาดใหญ่? (OpenJDK: 11-JRE บาง)


145

Java 11 ได้รับการประกาศให้เป็นรุ่น LTS ล่าสุด ดังนั้นเราจึงพยายามที่จะเริ่มบริการใหม่ ๆ โดยใช้ Java เวอร์ชันนี้

อย่างไรก็ตามอิมเมจ Docker พื้นฐานสำหรับ Java 11 มีขนาดใหญ่กว่าเทียบเท่าสำหรับ Java 8:

(ฉันกำลังพิจารณาเฉพาะOpenJDK อย่างเป็นทางการและรูปภาพที่มีน้ำหนักเบาที่สุดสำหรับแต่ละเวอร์ชัน Java)

Deeper ขุดค้นพบสิ่งต่าง ๆ ต่อไปนี้:

  • ภาพใช้ภาพฐานopenjdk:11-jre-slim debian:sid-slimสิ่งนี้นำมาซึ่ง 2 ประเด็น:

    • นี่คือใหญ่กว่า 60 MB alpine:3.8

    • Debiansidรุ่นจะไม่แน่นอน

  • openjdk-11-jre-headlessแพคเกจติดตั้งในภาพเป็น3 ครั้งมีขนาดใหญ่กว่าopenjdk8-jre(ภายในวิ่งหางภาชนะ):

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

      ฉันจะค้นพบ "รากฐาน" ของความหนักหน่วงนี้ - มันเป็นmodulesไฟล์ของ JDK:

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

ดังนั้นตอนนี้คำถามที่มา:

  • เหตุใดจึงalpineไม่ใช้อีกเป็นอิมเมจพื้นฐานสำหรับ Java 11 อิมเมจแบบบาง

  • ทำไมเวอร์ชันsid ที่ไม่เสถียรใช้สำหรับอิมเมจ LTS Java?

  • เหตุใดแพ็คเกจ slim / headless / JRE สำหรับ OpenJDK 11 จึงใหญ่กว่าเมื่อเทียบกับแพ็คเกจ OpenJDK 8 ที่คล้ายกัน

    • นี่คือสิ่งที่โมดูลไฟล์ที่นำ 135 MB ใน OpenJDK 11?

UPD : ในฐานะที่เป็นโซลูชั่นสำหรับความท้าทายเหล่านี้เราสามารถใช้คำตอบนี้: แอปพลิเคชัน Java 11 เป็นอิมเมจนักเทียบท่า


1
ดีสำหรับรุ่นใหม่ (JDK 9+) ของ Java ถูกทำให้เป็นโมดูลซึ่งอธิบายว่าทำไมมีโมดูลใน 11 vs 8
Zachary Craig


13
ไม่มี JRE 11 ดังนั้นสิ่งที่คุณมีคือ JDK แบบเต็ม คุณสามารถสร้างสภาพแวดล้อมที่กะทัดรัดแม้จะบางกว่า JRE 8 แต่มันต้องการแอปพลิเคชั่นแบบแยกส่วนที่แท้จริงเพื่อให้ทราบถึงการพึ่งพา
Holger

1
นอกเหนือจากที่กล่าวมาข้างต้นไม่ใช่ว่าทุกโมดูลที่คุณพบว่าเป็นเหตุผลของการเพิ่มขนาดนั้นจำเป็นสำหรับแอพพลิเคชั่นของคุณ แต่หากต้องการทราบว่าคุณจะต้องสร้างแอพพลิเคชั่นแบบแยกส่วน คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับjlink (แนะนำใน Java9) เพื่อประโยชน์นั้น
Naman

1
อาจเป็นเวลาที่ดีกว่าในการอ่านออนไลน์ - twitter.com/LogicTheoryIO/status/1064503559071371265
Naman

คำตอบ:


172

เหตุใดจึงalpineไม่ใช้อีกเป็นอิมเมจพื้นฐานสำหรับ Java 11 อิมเมจแบบบาง

นั่นเป็นเพราะน่าเสียดายที่ไม่มี OpenJDK 11 บิวด์อย่างเป็นทางการสำหรับอัลไพน์ในปัจจุบัน

อัลไพน์ใช้ musl libc เมื่อเทียบกับ glibc มาตรฐานที่ใช้โดย Linuxes ส่วนใหญ่ซึ่งหมายความว่า JVM จะต้องเข้ากันได้กับ musl libc สำหรับสนับสนุนวานิลลาอัลไพน์ พอร์ต musl OpenJDK ได้รับการพัฒนาภายใต้Portolaของ OpenJDKโครงการ

สถานะปัจจุบันถูกสรุปในหน้าOpenJDK 11 :

การสร้างอัลไพน์ Linux ที่มีอยู่ก่อนหน้านี้ในหน้านี้ถูกลบตั้งแต่ JDK 11 GA ยังไม่พร้อมผลิตเนื่องจากยังไม่ได้ทดสอบอย่างละเอียดเพียงพอที่จะพิจารณาว่าเป็นบิลด์ GA โปรดใช้ JDK 12 Alpine Linux ที่สร้างขึ้นก่อนหน้านี้แทน

รุ่น OpenJDK ที่เสถียรเพียงเวอร์ชันเดียวในปัจจุบันคือ 7 และ 8 จัดทำโดยIcedTeaโครงการ

อย่างไรก็ตาม - ถ้าคุณยินดีที่จะพิจารณานอกเหนือจาก OpenJDK อย่างเป็นทางการซูลูของ Azul OpenJDKเสนอทางเลือกที่น่าสนใจ:

  • มันรองรับ Java 11 บน Alpine musl (รุ่น 11.0.2 ณ เวลาที่เขียน);
  • มันเป็นบิลด์ OpenJDK ที่ผ่านการรับรองตรวจสอบโดยใช้ OpenJDK TCK Compliance Suite;
  • มันฟรีโอเพนซอร์สและพร้อมนักเทียบท่า ( Dockerhub )

สำหรับความพร้อมในการสนับสนุนและแผนการทำงานให้ดูที่แผนการสนับสนุนของ Azulแผนงานสนับสนุน

อัปเดต 3/6/19:เมื่อวานนี้openjdk11มีให้บริการในที่เก็บของอัลไพน์! มันสามารถคว้าอัลไพน์โดยใช้:

apk --no-cache add openjdk11

แพคเกจจะขึ้นอยู่กับjdk11uสาขา OpenJDK บวกแก้ไขรังเพลิงจากโครงการ Portola แนะนำมีดังต่อไปนี้การประชาสัมพันธ์ ความรุ่งโรจน์และขอบคุณมากสำหรับทีมอัลไพน์

ทำไมเวอร์ชันsid ที่ไม่เสถียรใช้สำหรับอิมเมจ LTS Java?

นั่นเป็นคำถาม / คำขอที่ยุติธรรม มีตั๋วเปิดจริงสำหรับให้บริการ Java 11 ในรุ่นเดเบียนที่เสถียร:
https://github.com/docker-library/openjdk/issues/237

Update, 26/12/18:ปัญหาได้รับการแก้ไขแล้วและตอนนี้อิมเมจเพรียวบาง OpenJDK 11 ใช้stretch-backportsOpenJDK 11 ซึ่งเพิ่งเปิดให้ใช้งานเมื่อไม่นานมานี้ ( ลิงค์ PR )

เหตุใดแพ็คเกจ slim / headless / JRE สำหรับ OpenJDK 11 จึงใหญ่กว่าเมื่อเทียบกับแพ็คเกจ OpenJDK 8 ที่คล้ายกัน นี่คือสิ่งที่โมดูลไฟล์ที่นำ 135 MB ใน OpenJDK 11?

Java 9 แนะนำระบบโมดูลซึ่งเป็นวิธีการใหม่และปรับปรุงสำหรับการจัดกลุ่มแพ็กเกจและทรัพยากรเมื่อเทียบกับไฟล์ jar บทความจาก Oracle นี้ให้รายละเอียดเกี่ยวกับคุณสมบัตินี้:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html

modulesไฟล์รวมกลุ่มโมดูลทั้งหมดมาพร้อมกับ JRE รายการทั้งหมดของโมดูลสามารถพิมพ์java --list-modulesได้modulesย่อมเป็นไฟล์ที่มีขนาดใหญ่มากและตามความเห็นมันมีโมดูลมาตรฐานทั้งหมดและดังนั้นจึงค่อนข้างป่อง

สิ่งหนึ่งที่ควรทราบก็คือมันแทนที่rt.jarและtools.jarกลายเป็นสิ่งที่ไม่เป็นที่นิยมในหมู่สิ่งอื่น ๆ ดังนั้นเมื่อบัญชีสำหรับขนาดของmodulesเมื่อเทียบกับการสร้าง OpenJDK ล่วงหน้าก่อน 9 ขนาดrt.jarและtools.jarควรจะถูกลบออก (พวกเขาควรรวมกัน 80MB) .


9

สำหรับ 07.2019 https://adoptopenjdk.net/ได้รับการสนับสนุนอย่างเป็นทางการจาก Alpine สำหรับ Java 11:

อย่างไรก็ตามโมดูล ( jmods ,jlink ) ยังคงต้องได้รับการพิจารณาเมื่อหนึ่งมั่งแอพลิเคชันน้อยที่สุด

หมายเหตุ : บางภาพไม่ได้มีบางโมดูล (ชอบjava.sql) - พวกเขาจะได้รับการยกเว้นอย่างชัดเจน ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233 )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.