创建基于Java 11的SpringBoot Docker镜像到48M!

栏目: Java · 发布时间: 5年前

内容简介:本文介绍使用AdoptOpenJDK的Alpine JDK 11版本,能够将一个SpringBoot应用大小最大化到48M,DockerHub镜像地址:Dockerfile配置如下:

本文介绍使用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 <b>for</b> spring-boot
# 
###########################################################
FROM adoptopenjdk/openjdk11:alpine AS builder

# create custom jre
RUN jlink \
    --module-path=<font>"${JAVA_HOME}/jmods"</font><font> \
    --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=</font><font>"/opt/jre-min"</font><font>
ENV PATH=</font><font>"$PATH:/opt/jre-min/bin"</font><font>
ENV JAVA_VERSION=</font><font>"jdk-11.0.1+13"</font><font>
ENV JAVA_TOOL_OPTIONS=</font><font>"-XX:+UseContainerSupport"</font><font>

# add glibc-compat
RUN apk --update add --no-cache ca-certificates curl openssl binutils xz \
    && GLIBC_VER=</font><font>"2.28-r0"</font><font> \
    && ALPINE_GLIBC_REPO=</font><font>"https://github.com/sgerrand/alpine-pkg-glibc/releases/download"</font><font> \
    && GCC_LIBS_URL=</font><font>"https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-8.2.1%2B20180831-1-x86_64.pkg.tar.xz"</font><font> \
    && GCC_LIBS_SHA256=e4b39fb1f5957c5aab5c2ce0c46e03d30426f3b94b9992b009d417ff2d56af4d \
    && ZLIB_URL=</font><font>"https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.9-1-x86_64.pkg.tar.xz"</font><font> \
    && ZLIB_SHA256=bb0959c08c1735de27abf01440a6f8a17c5c51e61c3b4c707e988c906d3b7f67 \
    && curl -Ls https:</font><font><i>//alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \</i></font><font>
    && 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 </font><font>"${GCC_LIBS_SHA256}  /tmp/gcc-libs.tar.xz"</font><font> | 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 </font><font>"${ZLIB_SHA256}  /tmp/libz.tar.xz"</font><font> | 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 /<b>var</b>/cache/apk</font><font><i>/*

COPY --from=builder /opt/jre-min /opt/jre-min
</i></font>

使用专门为 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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Iterative Methods for Sparse Linear Systems, Second Edition

Iterative Methods for Sparse Linear Systems, Second Edition

Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00

Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具