Java 11 기본 Docker 이미지가 왜 그렇게 큰가요? (openjdk : 11-jre- 슬림) Java 8의

Java 11은 최신 LTS 버전으로 발표되었습니다. 따라서이 Java 버전을 기반으로 새로운 서비스를 시작하려고합니다.

그러나 Java 11의 기본 Docker 이미지는 Java 8의 이미지보다 훨씬 큽니다.

( 공식 OpenJDK 만 고려하고 있습니다. 와 각 Java 버전에 대해 가장 가벼운 이미지 하고 있습니다.)

더 깊이 파고 들면 다음과 같은 것들이 발견되었습니다.

  • openjdk:11-jre-slim이미지는베이스 이미지를 사용debian:sid-slim . 이것은 두 가지 문제를 가져옵니다.

    • 이보다 60MB 더 큽니다. 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/

      더 깊이 들어가면이 무거움의 “루트”를 발견했습니다 modules. JDK 의 파일입니다.

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

이제 질문이 왔습니다.

  • alpineJava 11 슬림 이미지의 기본 이미지로 더 이상 사용되지 않는 입니까?

  • 왜 불안정한 sid 버전이 LTS Java 이미지에 사용되는 입니까?

  • OpenJDK 11 용 슬림 / 헤드리스 / JRE 패키지가 비슷한 OpenJDK 8 패키지에 비해 왜 그렇게 큰가요?

    • OpenJDK 11에서 135MB를 가져 오는 이 모듈 파일 은 무엇입니까 ?

UPD : 이러한 과제에 대한 솔루션으로 다음 답변을 사용할 수 있습니다. 도커 이미지로 Java 11 응용 프로그램



답변

alpineJava 11 슬림 이미지의 기본 이미지로 더 이상 사용되지 않는 이유는 무엇 입니까?

슬프게도 현재 Alpine을위한 공식적인 안정적인 OpenJDK 11 빌드가 없기 때문입니다.

Alpine은 대부분의 Linux에서 사용하는 표준 glibc와 달리 musl libc를 사용하므로 JVM은 바닐라 알파인을 지원하기 위해 musl libc와 호환되어야합니다. musl OpenJDK 포트는 OpenJDK의 Portola 에서 개발 중입니다. 프로젝트 입니다.

현재 상태는 OpenJDK 11 페이지 에 요약되어 있습니다 .

이 페이지에서 이전에 사용 가능한 Alpine Linux 빌드는 JDK 11 GA에서 제거되었습니다. GA 빌드로 간주되기에 충분히 테스트되지 않았기 때문에 프로덕션 용이 아닙니다. 그 대신에 초기 액세스 JDK 12 Alpine Linux 빌드를 사용하십시오.

알파인을위한 유일한 안정적인 OpenJDK 버전은 현재 IcedTea 에서 제공하는 7과 8입니다. 프로젝트 입니다.

그러나 공식 OpenJDK 이외의 다른 것을 고려하고 싶다면 Azul의 Zulu OpenJDK는 매력적인 대안을 제공합니다.

  • Alpine musl에서 Java 11을 지원합니다 (작성 당시 버전 11.0.2).
  • OpenJDK TCK 준수 제품군을 사용하여 검증 된 인증 된 OpenJDK 빌드입니다.
  • 무료이며 오픈 소스이며도 커가 준비되어 있습니다 ( Dockerhub ).

지원 가용성 및 로드맵은 Azul 지원 로드맵을 참조하십시오 .

업데이트, 3/6/19 : 어제부터 openjdk11알파인 리포지토리에서 사용할 수 있습니다! 다음을 사용하여 알파인에서 잡을 수 있습니다.

apk --no-cache add openjdk11

이 패키지는 jdk11uOpenJDK 브랜치와 Portola 프로젝트의 포트 픽스를 기반으로 하며 다음 PR 과 함께 소개됩니다 . 알파인 팀 덕분에 큰 도움이되었습니다.

불안정한 sid 버전이 LTS Java 이미지에 사용되는 이유는 무엇 입니까?

그것은 공정한 질문 / 요청입니다. 안정적인 데비안 릴리스에서 Java 11을 제공하기위한 공개 티켓이 있습니다 :
https://github.com/docker-library/openjdk/issues/237

업데이트, 26/12/18 : 문제가 해결되었으며, 이제 OpenJDK 11 슬림 이미지는 stretch-backports최근에 제공되었던 OpenJDK 11을 기반 으로합니다 ( PR 링크 ).

OpenJDK 11 용 슬림 / 헤드리스 / JRE 패키지가 유사한 OpenJDK 8 패키지에 비해 왜 그렇게 큰가요? 이게 뭐야OpenJDK 11에서 135MB를 가져 오는 모듈 파일 ?

Java 9는 jar 파일과 비교하여 패키지 및 자원을 그룹화하는 새롭고 개선 된 접근 방식 인 모듈 시스템을 도입했습니다. Oracle의이 기사는이 기능에 대한 매우 자세한 소개를 제공합니다.
https://www.oracle.com/corporate/features/understanding-java-9-modules.html

modules파일은 JRE와 함께 제공된 모든 모듈을 번들로 제공합니다. 모듈의 전체 목록은java --list-modules . modules실제로 매우 큰 파일이며, 언급 한 것처럼 모든 표준 모듈을 포함하므로 상당히 부풀어 오른다.

그러나주의 할 것은 그것이 바꾸는 것입니다 rt.jartools.jar크기에 대한 회계 처리를 할 때, 그래서, 무엇보다도이 된 사용되지 modules하는 비교했을 때 사전 (9) 오픈 JDK 빌드는의 크기 rt.jartools.jar공제해야한다 (그들은 결합 일부 80메가바이트을 차지한다) .


답변

2019 년 7 월 https://adoptopenjdk.net/ 은 Java 11에 대한 공식 Alpine 지원을 제공합니다.

그러나, 모듈 ( jmods은 , jlink) 정지 할 때 최소한 하나 개의 조립 애플리케이션으로 간주되어야한다.

참고 : 슬림 이미지에는 같은 모듈이 포함되어 있지 않습니다 java.sql-명시 적으로 제외됩니다 ( https://github.com/AdoptOpenJDK/openjdk-docker/blob/21b8393b9c23f94d6921a56cce27b026537c6ca2/11/jdk/alpine/slim-java.sh#L233 )