Java 11 बेस डॉकर इमेज इतनी बड़ी क्यों है? (Openjdk: 11-JRE पतला)


145

जावा 11 को सबसे हालिया एलटीएस संस्करण घोषित किया गया है। इसलिए, हम इस जावा संस्करण के आधार पर नई सेवाएँ शुरू करने का प्रयास कर रहे हैं।

हालाँकि, जावा 11 के लिए बेस डॉक की छवि जावा 8 के लिए समकक्ष से बहुत बड़ी है:

(मैं केवल आधिकारिक OpenJDK और प्रत्येक जावा संस्करण के लिए सबसे हल्के चित्रों पर विचार कर रहा हूं ।)

गहरा खुदाई ने निम्नलिखित "चीजों" को उजागर किया:

  • openjdk:11-jre-slimछवि आधार छवि का उपयोग करता है debian:sid-slim। यह 2 मुद्दे लाता है:

    • यह 60 एमबी से बड़ा है alpine:3.8

    • डेबियनsid संस्करण अस्थिर कर रहे हैं

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

      गहराई में जाने पर मुझे इस भारीपन की "जड़" का पता चला - यह modulesJDK की फाइल है:

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

तो, अब जो प्रश्न आए:

  • alpineजावा 11 स्लिम इमेज के लिए बेस इमेज के रूप में किसी और का उपयोग क्यों नहीं किया जाता है?

  • एलटीएस जावा छवियों के लिए अस्थिर किनारे संस्करण का उपयोग क्यों किया जाता है?

  • OpenJDK 11 के लिए स्लिम / हेडलेस / JRE पैकेज समान OpenJDK 8 पैकेज की तुलना में इतना बड़ा क्यों है?

    • यह मॉड्यूल फ़ाइल क्या है जो OpenJDK 11 में 135 एमबी लाता है?

UPD : इन चुनौतियों के समाधान के रूप में, कोई भी इस उत्तर का उपयोग कर सकता है: Java 11 अनुप्रयोग docker इमेज के रूप में


1
जावा के एक नए संस्करण (JDK 9+) के लिए अच्छी तरह से संशोधित किया गया है , जो बताता है कि 11 बनाम 8 में मॉड्यूल क्यों हैं
Zachary Craig


13
कोई JRE 11 नहीं है, इसलिए आपके पास क्या है, एक पूर्ण JDK है। आप जेआरई 8 की तुलना में कॉम्पैक्ट वातावरण बना सकते हैं, यहां तक ​​कि पतला भी हो सकता है, लेकिन इसके लिए एक वास्तविक मॉड्यूलर एप्लिकेशन की आवश्यकता होती है, ताकि निर्भरता का पता चल सके।
होल्गर

1
उपरोक्त के अतिरिक्त, उन सभी मॉड्यूलों को नहीं जिन्हें आप आकार में वृद्धि के कारण के रूप में पाते हैं, वास्तव में आपके अनुप्रयोगों के लिए आवश्यक हैं। लेकिन यह पता लगाने के लिए कि आप एक मॉड्यूलर एप्लिकेशन बनाने की दिशा में आगे बढ़ेंगे। आप उस खातिर jlink (Java9 में पेश) के बारे में अधिक जानकारी प्राप्त कर सकते हैं ।
नमन

1
इसे ऑनलाइन पढ़ने के लिए इससे बेहतर समय क्या हो सकता है - twitter.com/LogicTheoryIO/status/1064503559071371265
नमन

जवाबों:


172

alpineजावा 11 स्लिम इमेज के लिए बेस इमेज के रूप में किसी और का उपयोग क्यों नहीं किया जाता है?

ऐसा इसलिए है, क्योंकि दुख की बात है कि अल्पाइन के लिए कोई आधिकारिक स्थिर OpenJDK 11 बिल्ड नहीं है।

अल्पाइन ने म्यूसिल लिबास का उपयोग किया है, क्योंकि अधिकांश लिनक्स द्वारा उपयोग किए जाने वाले मानक ग्लिबक के विपरीत, जिसका अर्थ है कि एक जेवीएम को वेनिला अल्पाइन के समर्थन के लिए मस्कल लिबक के साथ संगत होना चाहिए। OpenJDK के पोर्टोला प्रोजेक्ट के तहत मस्तूल OpenJDK पोर्ट विकसित किया जा रहा है ।

वर्तमान स्थिति OpenJDK 11 पृष्ठ पर संक्षेपित है :

इस पृष्ठ पर पहले उपलब्ध अल्पाइन लिनक्स निर्माण को JDK 11 GA के रूप में हटा दिया गया था। यह उत्पादन-तैयार नहीं है क्योंकि इसे जीए बिल्ड माना जाने के लिए पूरी तरह से परीक्षण नहीं किया गया है। कृपया इसके स्थान पर JDK 12 अल्पाइन लिनक्स बिल्ड के शुरुआती एक्सेस का उपयोग करें।

अल्पाइन के लिए केवल स्थिर OpenJDK संस्करण वर्तमान में 7 और 8 हैं, IcedTea परियोजना द्वारा प्रदान किए गए हैं ।

हालाँकि - यदि आप आधिकारिक OpenJDK के अलावा अन्य पर विचार करने को तैयार हैं, तो Azul का ज़ुलु OpenJDK एक सम्मोहक विकल्प प्रस्तुत करता है:

  • यह अल्पाइन कस्तूरी पर जावा 11 का समर्थन करता है (लेखन के समय के रूप में संस्करण 11.0.2);
  • यह एक प्रमाणित OpenJDK बिल्ड है, जो OpenJDK TCK अनुपालन सूट का उपयोग करके सत्यापित किया गया है;
  • यह स्वतंत्र, खुला स्रोत और docker तैयार ( Dockerhub ) है।

समर्थन उपलब्धता और रोडमैप के लिए, अज़ुल समर्थन रोडमैप देखें ।

अद्यतन, 3/6/19: कल के रूप में, openjdk11अल्पाइन रिपॉजिटरी में उपलब्ध है! यह अल्पाइन का उपयोग कर पकड़ा जा सकता है:

apk --no-cache add openjdk11

पैकेज jdk11uOpenJDK शाखा पर आधारित है और परियोजना पोर्टोला से पोर्ट किए गए फिक्स, निम्नलिखित पीआर के साथ पेश किए गए हैं । यश और अल्पाइन टीम का बहुत बड़ा धन्यवाद।

एलटीएस जावा छवियों के लिए अस्थिर किनारे संस्करण का उपयोग क्यों किया जाता है?

यह एक उचित प्रश्न / अनुरोध है। वास्तव में एक स्थिर डेबियन रिलीज पर जावा 11 प्रदान करने के लिए एक खुला टिकट है:
https://github.com/docker-library/openjdk/issues/237

अद्यतन, 26/12/18: समस्या हल हो गई है, और अब OpenJDK 11 स्लिम छवि stretch-backportsOpenJDK 11 पर आधारित है जिसे हाल ही में उपलब्ध कराया गया था ( PR लिंक )।

OpenJDK 11 के लिए स्लिम / हेडलेस / JRE पैकेज समान OpenJDK 8 पैकेज की तुलना में इतना बड़ा क्यों है? यह मॉड्यूल फ़ाइल क्या है जो OpenJDK 11 में 135 एमबी लाता है?

जावा 9 ने मॉड्यूल सिस्टम की शुरुआत की, जो कि जार फाइलों की तुलना में संकुल और संसाधनों के समूहन के लिए एक नया और बेहतर तरीका है। ओरेकल का यह लेख इस सुविधा का बहुत विस्तृत परिचय देता है:
https://www.oracle.com/corporate/features/understanding-java-9-modules.html

modulesफ़ाइल JRE के साथ भेज दिया सभी मॉड्यूल बंडल। मॉड्यूल की पूरी सूची के साथ मुद्रित किया जा सकता है java --list-modulesmodulesवास्तव में एक बहुत बड़ी फ़ाइल है, और जैसा कि टिप्पणी की गई है, इसमें सभी मानक मॉड्यूल शामिल हैं, और इसलिए यह काफी फूला हुआ है।

लेकिन ध्यान देने योग्य एक बात यह है कि यह बदल देता है rt.jarऔर tools.jarजो बन गया पदावनत, अन्य बातों के अलावा, इसलिए जब के आकार के लिए लेखांकन modulesजब की तुलना में पहले से 9 OpenJDK बनाता है, के आकार rt.jarऔर tools.jarघटा दिया जाना चाहिए (वे कुछ संयुक्त 80MB लेना चाहिए) ।


9

07.2019 तक https://adoptopenjdk.net/ पर जावा 11 के लिए आधिकारिक अल्पाइन समर्थन है:

हालांकि, मॉड्यूल ( jmodsjlink ) , तब भी विचार किया जाएगा जब एक कम से कम एक कोडांतरण

ध्यान दें : पतली छवियों में कुछ मॉड्यूल नहीं होते हैं (जैसे java.sql) - उन्हें स्पष्ट रूप से बाहर रखा गया है ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23d94d6921a56cce27b026537c6ca2/11/jdk/alpine/slamine/sline) )


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.