Tại sao hình ảnh Docker cơ sở Java 11 lại lớn như vậy? (openjdk: 11-jre-slim)


145

Java 11 được công bố là phiên bản LTS gần đây nhất. Vì vậy, chúng tôi đang cố gắng bắt đầu các dịch vụ mới dựa trên phiên bản Java này.

Tuy nhiên, hình ảnh Docker cơ sở cho Java 11 lớn hơn nhiều so với tương đương với Java 8:

(Tôi chỉ xem xét OpenJDK chính thức và hình ảnh nhẹ nhất cho mỗi phiên bản Java.)

Đào sâu hơn đã phát hiện ra những "điều" sau:

  • những openjdk:11-jre-slimhình ảnh sử dụng hình ảnh cơ bản debian:sid-slim. Điều này mang lại 2 vấn đề:

    • cái này lớn hơn 60 MB alpine:3.8

    • các phiên bản Debiansid không ổn định

  • các openjdk-11-jre-headlessgói cài đặt trong hình ảnh là lớn hơn 3 lần so với openjdk8-jre(bên trong chạy Docker container):

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

      Đi sâu hơn tôi phát hiện ra "gốc" của sự nặng nề này - đó là modulestệp của JDK:

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

Vì vậy, bây giờ các câu hỏi đã đến:

  • Tại sao alpinekhông được sử dụng nữa làm hình ảnh cơ sở cho hình ảnh mỏng Java 11?

  • Tại sao phiên bản sid không ổn định được sử dụng cho hình ảnh Java LTS?

  • Tại sao gói mỏng / không đầu / JRE cho OpenJDK 11 lại lớn như vậy so với gói OpenJDK 8 tương tự?

    • Đây là những gì các module tập tin mà mang 135 MB trong OpenJDK 11?

CẬP NHẬT : như một giải pháp cho những thách thức này, người ta có thể sử dụng câu trả lời này: ứng dụng Java 11 làm hình ảnh docker


1
Vâng, đối với một phiên bản mới (JDK 9+) của Java được mô đun hóa , điều này giải thích tại sao có các mô-đun trong 11 so với 8.
Zachary Craig


13
Không có JRE 11, vì vậy những gì bạn có, là một JDK đầy đủ. Bạn có thể tạo các môi trường nhỏ gọn, thậm chí mỏng hơn JRE 8, nhưng nó yêu cầu một ứng dụng mô-đun thực tế, để biết được sự phụ thuộc.
Holger

1
Ngoài ra, không phải tất cả các mô-đun mà bạn thấy là lý do tăng kích thước thực sự cần thiết cho các ứng dụng của bạn. Nhưng để tìm ra cái nào bạn sẽ tiến tới tạo ra một ứng dụng mô-đun. Bạn có thể tìm hiểu thêm về jlink (được giới thiệu trong Java9 ) vì mục đích đó.
Naman

1
Điều gì có thể là thời điểm tốt hơn để đọc trực tuyến này - twitter.com/LogicTheoryIO/status/1064503559071371265
Naman

Câu trả lời:


172

Tại sao alpinekhông được sử dụng nữa làm hình ảnh cơ sở cho hình ảnh mỏng Java 11?

Điều đó là bởi vì, thật đáng buồn, hiện tại không có bản dựng OpenJDK 11 ổn định chính thức nào cho Alpine.

Alpine sử dụng musc libc, trái ngược với glibc tiêu chuẩn được sử dụng bởi hầu hết các Linux ngoài đó, điều đó có nghĩa là JVM phải tương thích với libc musc để hỗ trợ vanilla Alpine. Cổng OpenJDK musl đang được phát triển trong dự án Portola của OpenJDK .

Trạng thái hiện tại được tóm tắt trên trang OpenJDK 11 :

Bản dựng Linux Linux có sẵn trước đây trên trang này đã bị xóa kể từ JDK 11 GA. Nó không sẵn sàng sản xuất vì nó chưa được kiểm tra kỹ lưỡng đủ để được coi là bản dựng GA. Vui lòng sử dụng bản dựng JDK 12 Alpine Linux truy cập sớm vào vị trí của nó.

Các phiên bản OpenJDK ổn định duy nhất cho Alpine hiện tại là 7 và 8, được cung cấp bởi dự án IcedTea .

Tuy nhiên - nếu bạn sẵn sàng xem xét khác với OpenJDK chính thức, Zulu OpenJDK của Azul cung cấp một giải pháp thay thế hấp dẫn:

  • Nó hỗ trợ Java 11 trên Alpine musl (phiên bản 11.0.2 tại thời điểm viết bài);
  • Nó là bản dựng OpenJDK được chứng nhận, được xác minh bằng bộ tuân thủ OpenJDK TCK;
  • Nó là miễn phí, mã nguồn mở và docker đã sẵn sàng ( Dockerhub ).

Để biết hỗ trợ và lộ trình hỗ trợ , xem lộ trình hỗ trợ của Azul .

Cập nhật, 3/6/19: Tính đến ngày hôm qua, openjdk11có sẵn trong kho của Alpine! Nó có thể được lấy trên Alpine bằng cách sử dụng:

apk --no-cache add openjdk11

Gói này dựa trên jdk11unhánh OpenJDK cộng với các bản sửa lỗi được chuyển từ dự án Portola, được giới thiệu với PR sau . Kudos và rất cảm ơn đội ngũ Alpine.

Tại sao phiên bản sid không ổn định được sử dụng cho hình ảnh Java LTS?

Đó là một câu hỏi / yêu cầu công bằng. Thực sự có một vé mở để cung cấp Java 11 trên bản phát hành Debian ổn định:
https://github.com/docker-l Library / openjdk/issues/237

Cập nhật, 26/12/18: Vấn đề đã được giải quyết, và bây giờ hình ảnh mỏng của OpenJDK 11 dựa trên stretch-backportsOpenJDK 11 gần đây đã có sẵn ( liên kết PR ).

Tại sao gói mỏng / không đầu / JRE cho OpenJDK 11 lại lớn như vậy so với gói OpenJDK 8 tương tự? Đây là những gì các module tập tin mà mang 135 MB trong OpenJDK 11?

Java 9 đã giới thiệu hệ thống mô-đun, đây là một cách tiếp cận mới và được cải tiến để nhóm các gói và tài nguyên, so với các tệp jar. Bài viết này của Oracle giới thiệu rất chi tiết về tính năng này: https :
//www.oracle.com/cor merg / tests / under Hiểu-java-9-mô-đun.html

Các modulestập tin bó tất cả các mô-đun được vận chuyển với JRE. Danh sách đầy đủ các mô-đun có thể được in với java --list-modules. modulesthực sự là một tập tin rất lớn, và như đã nhận xét, nó chứa tất cả các mô-đun tiêu chuẩn, và do đó nó khá cồng kềnh.

Tuy nhiên, một điều cần lưu ý là nó thay thế rt.jartools.jarbị phản đối, trong số những thứ khác, vì vậy khi tính kích thước moduleskhi so sánh với các bản dựng OpenJDK trước 9, các kích thước rt.jartools.jarnên được trừ đi (chúng nên chiếm khoảng 80 MB kết hợp) .


9

vào ngày 07.2019 https://adoptopenjdk.net/ có hỗ trợ chính thức cho Java 11:

Tuy nhiên, các mô-đun ( jmods , jlink) vẫn sẽ được xem xét khi lắp ráp ứng dụng tối thiểu.

Lưu ý : hình ảnh mỏng không chứa một số mô-đun (như java.sql) - chúng được loại trừ một cách rõ ràng ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/j )


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.