基于 docker 构建 graalvm native 应用程序
Posted catoop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 docker 构建 graalvm native 应用程序相关的知识,希望对你有一定的参考价值。
使用本机构建 graal native 程序我们需要对环境进行配置,例如包括 graalvm、maven、native-image,如果我们把这些内容放在 docker 构建中执行,便不会占用宿主机的空间,也不会影响到宿主机的配置。最终形成的 docker 镜像文件也可以直接启动使用。
如下为 Dockerfile 示例,可供参考:
将一下内容存储为 Dockerfile 然后放置在 maven 项目的根目录下(同 pom.xml 文件放一起)
# Simple Dockerfile adding Maven and GraalVM Native Image compiler to the standard
# 镜像版本号来自 graalvm 官网 https://github.com/graalvm/container/pkgs/container/graalvm-ce
FROM ghcr.io/graalvm/graalvm-ce:ol8-java17-22.2.0
ADD . /build
WORKDIR /build
RUN \\
# For SDKMAN to work we need unzip & zip
# yum install -y unzip zip (graalvm/graalvm-c 默认没有yum所以改用rpm安装)
rpm -ivh https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/unzip-6.0-46.el8.x86_64.rpm && \\
rpm -ivh https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/getPackage/zip-3.0-23.el8.x86_64.rpm && \\
# Install SDKMAN
curl -s "https://get.sdkman.io" | bash; \\
source "$HOME/.sdkman/bin/sdkman-init.sh"; \\
sdk install maven; \\
# Install GraalVM Native Image
gu install native-image;
RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && mvn --version && native-image --version
RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && mvn -Pnative clean package
# We use a Docker multi-stage build here in order to only take the compiled native Spring Boot App from the first build container
FROM oraclelinux:7-slim
MAINTAINER SHANHY
# Add Spring Boot Native app spring-boot-graal to Container
COPY --from=0 "/build/target/spring-boot-graal" spring-boot-graal
# Fire up our Spring Boot Native app by default
CMD [ "sh", "-c", "./spring-boot-graal -Dserver.port=$PORT" ]
其中 rpm 包的下载地址源自 Oracle Linux 官网
# Oracle Linux 7
http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html
# 对应索引页
http://yum.oracle.com/oracle-linux-7.html
# Oracle linux 8
http://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/index.html
# 对应索引页
http://yum.oracle.com/oracle-linux-8.html
脚本中的主要步骤解释如下:
1、使用 oracle/graalvm-ce:20.1.0-java11 作为基础镜像(根据需求更换你需要的版本)
2、在基础镜像中安装 sdkman、基于sdkman安装maven、安装 native-image
3、进行maven构建打包(如果你maven连接私服则需要将maven配置文件加入进来)
4、进行第二阶段镜像构建,基础镜像为 oraclelinux:7-slim(根据需求更换你需要的镜像)
5、将第一阶段镜像的构建结果 COPY 到当前二阶段镜像中,命名为 spring-boot-graal
6、最终运行构建后的程序,启动服务,这里依然可以像运行 jar 一样通过 -D 传递参数
整个构建结束后一阶段镜像的所有内容不会保留,只会剩下仅包含应用程序的二阶段镜像。
建议将一阶段除最后一步maven构建以上的所有步骤做成一个本地镜像,这样省去每次联网下载安装maven和native-image的过程,提高效率。
关于文中提到的 sdkman:它是一个管理多个sdk版本的工具,支持 Java、Scala、Flink、Spark、Hadoop、Maven、Sbt 等,我们使用它来便捷的安装各种 sdk。
参考原文:https://blog.codecentric.de/en/2020/06/spring-boot-graalvm-native-image-maven-plugin/
(END)
以上是关于基于 docker 构建 graalvm native 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
GraalVM LTS版正式发布!可用于生产环境,基于JDK 11
GraalVM LTS版正式发布!可用于生产环境,基于JDK 11
以GraalVM原生镜像的方式运行Spring Boot应用程序