질문에 영감을 왜 자바 (11) 기본 도커 이미지가 너무 커서? (오픈 JDK : 11 JRE 슬림) 내가 자바 세계에서이 주제는 여전히 해결되지 않은 것을 발견했다.
에 관해서는 07 Dec 2018
일반적인 문제 / 함정 (위의 표에서 설명)이 있습니다 :
JRE는 별도의 "패키지"로 배포되지 않습니다. JDK에서 모듈 대신 사용해야합니다
오라클 오픈 JDK (11)는 지원하지 않습니다 리눅스 알파인를 , 그래서 가벼운 이미지를 쉽게 생성 할 수 없습니다
- 같은 시간에 현재의 안정적인 데비안 버전은 아직없는 자바 (11 개) 패키지 ( 우분투 자바 (10)가 설치되어 불안정 SID 버전이 기본 고정 표시기의 이미지에 사용되는 이유 즉, 오픈 JDK-11 패키지에서)
현재 사용 가능한 오라클 오픈 JDK-11 이미지는 미 박리 구축
libjvm.so
수백 메가 바이트를 가지고 개별적으로 제거해야 모듈을 :
이러한 문제의 결과로도 슬림 오라클 자바 (11) 기본 이미지는 매우 무겁고 불안정한 것으로 간주됩니다 https://hub.docker.com/_/openjdk/
질문은 그래서 :
무슨 일이되어 최적화 된 또는 권장 구축하고 고정 표시기 이미지로 자바 (11 개) 애플리케이션을 제공하는 방법을 ?
07.2019에서 UPD : https://stackoverflow.com/a/57145029/907576
(단 하나의 REST 엔드 포인트로) 단순 온천 부팅 응용 프로그램의 예로서 촬영은 지금까지 내가 고려 응용 프로그램 항아리의 위치는 (다음 해결책을 알아낼 수 있었다 build/libs/spring-boot-demo.jar
도커 빌드 전에를 :
제다이 경로 우리가 사용하려는 경우 안정적인 슬림 리눅스 버전에 대한 공식 오라클 오픈 JDK 배포 (
Debian 9 "Stretch"
지금을) :- 사용
debian:stretch-slim
(최신 안정) 기본 이미지 사용 도커 다단계 빌드
먼저 도커 빌드 단계 :
- 다운로드 및 설치
Oracle OpenJDK
최초의 부두 노동자 빌드 단계에 아카이브를 - 컴파일 자바 JRE (일명) 프로젝트에 대한 최소한의 분포를 사용하여
jlink
도구
- 다운로드 및 설치
둘째 도커 빌드 단계 :
- 새 이미지로 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 및 포함 된 모듈을 기본 이미지를 미리 구축
- 사용
간편한 방법으로 공급 업체의 오픈 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메가바이트 박리 고산 분포 예상대로.