linux cpu占用率如何看
342
2022-10-17
基于 docker 构建 graalvm native 应用程序
使用本机构建 graal native 程序我们需要对环境进行配置,例如包括 graalvm、maven、native-image,如果我们把这些内容放在 docker 构建中执行,便不会占用宿主机的空间,也不会影响到宿主机的配置。最终形成的 docker 镜像文件也可以直接启动使用。
将以下内容存储为 Dockerfile 然后放置在 maven 项目的根目录下(同 pom.xml 文件放一起)后,再执行 docker 构建命令:
docker build spring-native-demo:.0.0.1 .
如下提供两个 Dockerfile 示例,供参考,公司项目推荐使用离线模式的示例2。
Dockerfile 示例1
# Simple Dockerfile adding Maven and GraalVM Native Image compiler to the standard# 镜像版本号来自 graalvm 官网 ghcr.io/graalvm/graalvm-ce:ol8-java17-22.2.0 ADD . /buildWORKDIR /buildRUN \ # For SDKMAN to work we need unzip & zip # yum install -y unzip zip (graalvm/graalvm-c 默认没有yum所以改用rpm安装) rpm -ivh && \ rpm -ivh && \ # Install SDKMAN curl -s "| 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 --versionRUN source "$HOME/.sdkman/bin/sdkman-init.sh" && mvn -Pnative clean package -DskipTests # We use a Docker multi-stage build here in order to only take the compiled native Spring Boot App from the first build containerFROM oraclelinux:7-slimMAINTAINER SHANHY # Add Spring Boot Native app spring-boot-graal to ContainerCOPY --from=0 "/build/target/spring-native-demo" spring-native-demoENV PORT=8081# Fire up our Spring Boot Native app by defaultCMD [ "sh", "-c", "./spring-native-demo -Dserver.port=$PORT" ]
其中 rpm 包的下载地址源自 Oracle Linux 官网
# Oracle Linux 7 对应索引页Oracle linux 8 对应索引页
脚本中的主要步骤解释如下: 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。
参考文章:示例2(推荐)
# Simple Dockerfile adding Maven and GraalVM Native Image compiler to the standard# 镜像版本号来自 graalvm 官网 ghcr.io/graalvm/graalvm-ce:ol8-java17-22.2.0ADD /tools/ADD /tools/COPY . /buildWORKDIR /toolsRUN set -x && \ tar -xvf apache-maven-*.tar && \ rm -rf apache-maven-*.tar && \ mv apache-maven-* maven && \ mv native-image-installable-*.jar native-image-installable.jar && \ export MAVEN_HOME=/tools/maven && \ export PATH=$PATH:$MAVEN_HOME/bin && \ gu -L install native-image-installable.jar && \ mvn --version && \ native-image --version && \ cd /build && \ mvn -Pnative clean package -DskipTests# We use a Docker multi-stage build here in order to only take the compiled native Spring Boot App from the first build containerFROM oraclelinux:7-slim MAINTAINER Shanhy # Add Spring Boot Native app spring-boot-graal to ContainerCOPY --from=0 "/build/target/spring-native-demo" spring-native-demoENV PORT=8081# Fire up our Spring Boot Native app by defaultCMD [ "sh", "-c", "./spring-native-demo -Dserver.port=$PORT" ]
示例2相比示例1更清晰,更适合离线服务器环境,有几个要点说明如下: 1、apache-maven-3.8.6.tar 是自己本地修改好配置文件后使用 7z 压缩的,主要包含maven私服的配置 2、ADD 命令从本地环境下载 3、RUN 中的命令纯手工配置环境,最后进行maven构建项目
使用示例2Dockerfile 的 spring-native-demo 源代码地址为:https://github.com/xzxiaoshan/spring-native-demo
(END)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~