경량 고정 표시기 이미지로 자바 (11) 응용 프로그램

radistao :

질문에 영감을 왜 자바 (11) 기본 도커 이미지가 너무 커서? (오픈 JDK : 11 JRE 슬림) 내가 자바 세계에서이 주제는 여전히 해결되지 않은 것을 발견했다.

에 관해서는 07 Dec 2018일반적인 문제 / 함정 (위의 표에서 설명)이 있습니다 :

이러한 문제의 결과로도 슬림 오라클 자바 (11) 기본 이미지는 매우 무겁고 불안정한 것으로 간주됩니다 https://hub.docker.com/_/openjdk/

질문은 그래서 :

무슨 일이되어 최적화 된 또는 권장 구축하고 고정 표시기 이미지로 자바 (11 개) 애플리케이션을 제공하는 방법을 ?

radistao :

07.2019에서 UPD : https://stackoverflow.com/a/57145029/907576

(단 하나의 REST 엔드 포인트로) 단순 온천 부팅 응용 프로그램의 예로서 촬영은 지금까지 내가 고려 응용 프로그램 항아리의 위치는 (다음 해결책을 알아낼 수 있었다 build/libs/spring-boot-demo.jar도커 빌드 전에를 :

  1. 제다이 경로 우리가 사용하려는 경우 안정적인 슬림 리눅스 버전에 대한 공식 오라클 오픈 JDK 배포 ( Debian 9 "Stretch"지금을) :

    • 사용 debian:stretch-slim(최신 안정) 기본 이미지
    • 사용 도커 다단계 빌드

      1. 먼저 도커 빌드 단계 :

        • 다운로드 및 설치 Oracle OpenJDK최초의 부두 노동자 빌드 단계에 아카이브를
        • 컴파일 자바 JRE (일명) 프로젝트에 대한 최소한의 분포를 사용하여 jlink도구
      2. 둘째 도커 빌드 단계 :

        • 새 이미지로 1 단계에서 컴파일 된 최소한의 자바 분포를 복사
        • 액세스 자바 구성 경로
        • 이미지에 응용 프로그램 항아리 복사

    그래서, 최종 Dockerfile모습은 다음과 같이 떨어지게

    ( JDK 실현 VERSION, URL그리고 HASH값을 ) :

    # First stage: JDK 11 with modules required for Spring Boot
    FROM debian:stretch-slim as packager
    
    # source JDK distribution names
    # update from https://jdk.java.net/java-se-ri/11
    ENV JDK_VERSION="11.0.1"
    ENV JDK_URL="https://download.java.net/java/GA/jdk11/13/GPL/openjdk-${JDK_VERSION}_linux-x64_bin.tar.gz"
    ENV JDK_HASH="7a6bb980b9c91c478421f865087ad2d69086a0583aeeb9e69204785e8e97dcfd"
    ENV JDK_HASH_FILE="${JDK_ARJ_FILE}.sha2"
    ENV JDK_ARJ_FILE="openjdk-${JDK_VERSION}.tar.gz"
    # target JDK installation names
    ENV OPT="/opt"
    ENV JKD_DIR_NAME="jdk-${JDK_VERSION}"
    ENV JAVA_HOME="${OPT}/${JKD_DIR_NAME}"
    ENV JAVA_MINIMAL="${OPT}/java-minimal"
    
    # downlodad JDK to the local file
    ADD "$JDK_URL" "$JDK_ARJ_FILE"
    
    # verify downloaded file hashsum
    RUN { \
            echo "Verify downloaded JDK file $JDK_ARJ_FILE:" && \
            echo "$JDK_HASH $JDK_ARJ_FILE" > "$JDK_HASH_FILE" && \
            sha256sum -c "$JDK_HASH_FILE" ; \
        }
    
    # extract JDK and add to PATH
    RUN { \
            echo "Unpack downloaded JDK to ${JAVA_HOME}/:" && \
            mkdir -p "$OPT" && \
            tar xf "$JDK_ARJ_FILE" -C "$OPT" ; \
        }
    ENV PATH="$PATH:$JAVA_HOME/bin"
    
    RUN { \
            java --version ; \
            echo "jlink version:" && \
            jlink --version ; \
        }
    
    # build modules distribution
    RUN jlink \
        --verbose \
        --add-modules \
            java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
            # java.naming - javax/naming/NamingException
            # java.desktop - java/beans/PropertyEditorSupport
            # java.management - javax/management/MBeanServer
            # java.security.jgss - org/ietf/jgss/GSSException
            # java.instrument - java/lang/instrument/IllegalClassFormatException
        --compress 2 \
        --strip-debug \
        --no-header-files \
        --no-man-pages \
        --output "$JAVA_MINIMAL"
    
    # Second stage, add only our minimal "JRE" distr and our app
    FROM debian:stretch-slim
    
    ENV JAVA_HOME=/opt/java-minimal
    ENV PATH="$PATH:$JAVA_HOME/bin"
    
    COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
    COPY "build/libs/spring-boot-demo.jar" "/app.jar"
    
    EXPOSE 8080
    CMD [ "-jar", "/app.jar" ]
    ENTRYPOINT [ "java" ]
    

    참고 :

    • 최소 JRE 예 (도 5 개에 포함 된 자바 모듈이있다 java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument). 나는 그들이 "수동"응용 프로그램을 실행하고 고정 발견 ClassNotFoundException. 일부 중복 종속성을 제거와 동일하게, 자바 때 포함하는 모듈 몇 가지 더 봄 부팅 개발자 권장 / 가이드 대기, 같은 java.desktop단지에 사용되는 보인다PropertyEditorSupport
    • 당신은 몇 가지 모듈을 놓칠 두려워하는 경우 - 그들은 매우 가볍고 그들 모두는 함께 2메가바이트 크기 증가에 대해 제공합니다. 전체 목록 가져 오기 java.*jdk.*11 개 모듈 :

      java --list-modules | grep -E "^java\.[^@]*" | cut -d @ -f 1
      java --list-modules | grep -E "^jdk\.[^@]*" | cut -d @ -f 1

    내 경우 결과 이미지 크기였다 123메가바이트 최소 7 개 봄 부팅 모듈 및 125메가바이트 모두와 java.*모듈

    이 빌드 워크 플로우의 선택적 개선으로 :

    • 다운로드 및 추출 JDK와 이미지를 사전은-구축하고 첫 번째 단계를위한 기본 이미지로 사용
    • 당신이 모든 시간을 포함 할 모듈을 알고있는 경우 - 컴파일 최소한의 JRE 및 포함 된 모듈을 기본 이미지를 미리 구축
  2. 간편한 방법으로 공급 업체의 오픈 JDK 배포판 :

    오라클 반대 아줄의 줄루어 JDK (11 개) 지원 알파인 포트 와 각각의 기본이 도커 이미지를 .

줄루어 JVM / JDK이 존중되고있는 경우, 도커 빌드는 훨씬 간단합니다 :

FROM azul/zulu-openjdk-alpine:11 as packager

RUN { \
        java --version ; \
        echo "jlink version:" && \
        jlink --version ; \
    }

ENV JAVA_MINIMAL=/opt/jre

# build modules distribution
RUN jlink \
    --verbose \
    --add-modules \
        java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
        # java.naming - javax/naming/NamingException
        # java.desktop - java/beans/PropertyEditorSupport
        # java.management - javax/management/MBeanServer
        # java.security.jgss - org/ietf/jgss/GSSException
        # java.instrument - java/lang/instrument/IllegalClassFormatException
    --compress 2 \
    --strip-debug \
    --no-header-files \
    --no-man-pages \
    --output "$JAVA_MINIMAL"

# Second stage, add only our minimal "JRE" distr and our app
FROM alpine

ENV JAVA_MINIMAL=/opt/jre
ENV PATH="$PATH:$JAVA_MINIMAL/bin"

COPY --from=packager "$JAVA_MINIMAL" "$JAVA_MINIMAL"
COPY "build/libs/spring-boot-demo.jar" "/app.jar"

EXPOSE 8080
CMD [ "-jar", "/app.jar" ]
ENTRYPOINT [ "java" ]

생성 된 이미지는 73메가바이트 박리 고산 분포 예상대로.

추천

출처http://43.154.161.224:23101/article/api/json?id=37952&siteId=1