本文介绍使用AdoptOpenJDK的Alpine JDK 11版本,能够将一个SpringBoot应用大小最小化到48M,DockerHub镜像地址:https://hub.docker.com/r/shoutstar/spring-boot-jre-min-11
Dockerfile配置如下:
########################################################### # spring-boot-jre-min-11 # Custom JRE from AdobtOpenJDK11 for spring-boot # ########################################################### FROM adoptopenjdk/openjdk11:alpine AS builder
# create custom jre RUN jlink \ --module-path="${JAVA_HOME}/jmods" \ --compress=2 \ --add-modules=java.base,java.logging,java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument,jdk.charsets \ --no-header-files \ --no-man-pages \ --verbose \ --output=/opt/jre-min
# pull plane alpine FROM alpine:3.8
ENV JAVA_HOME="/opt/jre-min" ENV PATH="$PATH:/opt/jre-min/bin" ENV JAVA_VERSION="jdk-11.0.1+13" ENV JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport"
# add glibc-compat RUN apk --update add --no-cache ca-certificates curl openssl binutils xz \ && GLIBC_VER="2.28-r0" \ && ALPINE_GLIBC_REPO="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" \ && GCC_LIBS_URL="https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-8.2.1%2B20180831-1-x86_64.pkg.tar.xz" \ && GCC_LIBS_SHA256=e4b39fb1f5957c5aab5c2ce0c46e03d30426f3b94b9992b009d417ff2d56af4d \ && ZLIB_URL="https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.9-1-x86_64.pkg.tar.xz" \ && ZLIB_SHA256=bb0959c08c1735de27abf01440a6f8a17c5c51e61c3b4c707e988c906d3b7f67 \ && curl -Ls https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \ && curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk > /tmp/${GLIBC_VER}.apk \ && apk add /tmp/${GLIBC_VER}.apk \ && curl -Ls ${GCC_LIBS_URL} -o /tmp/gcc-libs.tar.xz \ && echo "${GCC_LIBS_SHA256} /tmp/gcc-libs.tar.xz" | sha256sum -c - \ && mkdir /tmp/gcc \ && tar -xf /tmp/gcc-libs.tar.xz -C /tmp/gcc \ && mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \ && strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \ && curl -Ls ${ZLIB_URL} -o /tmp/libz.tar.xz \ && echo "${ZLIB_SHA256} /tmp/libz.tar.xz" | sha256sum -c - \ && mkdir /tmp/libz \ && tar -xf /tmp/libz.tar.xz -C /tmp/libz \ && mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \ && apk del binutils \ && rm -rf /tmp/${GLIBC_VER}.apk /tmp/gcc /tmp/gcc-libs.tar.xz /tmp/libz /tmp/libz.tar.xz /var/cache/apk/*
COPY --from=builder /opt/jre-min /opt/jre-min
|
使用专门为Java应用构建镜像工具:Jib
Jib是Google今年7月发布OSS工具,帮助Java应用程序在使用Maven / Gradle时输出为Docker镜像,甚至在注册表中注册。
Jib提供了一种机制,不仅可以自动推送DockerHub,还可以自动推送GCR的GCR和AWS的ECR。这是一个巨大的好处,你可以自动化它而无需编写docker命令,也无需编写Dockerfile 。
在Jib中,您可以在配置中指定from镜像,但无法通过在此镜像上运行上面的jlink来自定义它。因此,如果您希望jlink与自定义JRE一起运行,则需要先创建基本镜像并将其发布到注册表中。
在Jib中,除了PUSH到注册表之外,还支持向本地Docker守护进程注册,创建tar等。
# 推到注册表 $ mvn compile jib:build
# 注册到当地Docker守护进程 $ mvn compile jib:dockerBuild
# 创建tar $ mvn compile jib:buildTar
|
设置使用Jav的Maven插件:
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>0.10.0</version> <configuration> <!-- 方便使用 --> <allowInsecureRegistries>true</allowInsecureRegistries> <from> <!-- 拉轻量级镜像,这是仅在从DockerHub定制JRE --> <image>shoutstar/spring-boot-jre-min-11</image> </from> <to> <!-- 在构建期间通过-Djib.to.image取代 --> <image>future/sprinb-boot-app</image> <!-- 构建时- Djib.to.替换为credHelpr <credHelper>ecr-login</credHelper> --> </to> <container> <jvmFlags> <jvmFlag>-Dadd-opens=java.base/java.lang=ALL-UNNAMED</jvmFlag> <jvmFlag>-Dadd-opens=java.base/java.lang.invoke=ALL-UNNAMED</jvmFlag> <jvmFlag>-Dspring.profiles.active=${spring.profiles.active}</jvmFlag> </jvmFlags> <!-- 构建时创建镜像的时间 --> <useCurrentTimestamp>true</useCurrentTimestamp> </container> </configuration> </plugin>
|