基于Openjdk容器打包运行jar程序

embedded/2024/9/23 10:30:17/

文章目录

  • 应用场景
  • 基于Openjdk容器打包运行jar程序
    • 1.编译项目成jar
    • 2.构建Dockerfile文件
      • 精简版-含jar
      • 精简版-不含jar
      • 带注释版-含jar
    • 3.编译Dockerfile成镜像。
    • 4.运行镜像:

应用场景

部署多版本jdk的应用程序。

jar_3">基于Openjdk容器打包运行jar程序

jar_4">1.编译项目成jar

编译后的jar包拷贝到有docker环境的机器,比如是jar包文件名为ruoyi-admin.jar

2.构建Dockerfile文件

jar包所在目录新建Dockerfile文件,填入下面的脚本

  • 拷贝jar包文件进去,
  • 指定jdk版本和暴露的端口。
  • 运行jar

jar_12">精简版-含jar

FROM openjdk:17.0.2-oraclelinux8
MAINTAINER wubingfeng
RUN mkdir -p /ruoyi/server/logs \/ruoyi/server/temp \/ruoyi/skywalking/agent
WORKDIR /ruoyi/server
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}
COPY ./ruoyi-admin.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \# 应用名称 如果想区分集群节点监控 改成不同的名称即可#-Dskywalking.agent.service_name=ruoyi-server \#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \-jar app.jar \-XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}

jar_31">精简版-不含jar

  • 比较适用于调试状态需要不断更新jar包,后续把jar包扔到容器映射的宿主机目录,重命名为jar,重启容器即可。
  • 基于下面的Dockerfile文件,jar包需要重命名为app.jar
  • 该版本运行容器时需要把宿主机的jar包所在目录映射到/ruoyi/server目录
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER wubingfeng
RUN mkdir -p /ruoyi/server/logs \/ruoyi/server/temp \/ruoyi/skywalking/agent
WORKDIR /ruoyi/server
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \# 应用名称 如果想区分集群节点监控 改成不同的名称即可#-Dskywalking.agent.service_name=ruoyi-server \#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \-jar app.jar \-XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}

jar_52">带注释版-含jar

# FROM参数指定基础镜像
FROM openjdk:17.0.2-oraclelinux8# MAINTAINER设置镜像作者信息。
# 可使用更灵活的LABEL参数代替,LABEL可设置任何需要设置的元数据
# LABEL MAINTAINER="wubingfeng"
MAINTAINER wubingfeng# RUN创建工作文件夹
# 尽量使用一个RUN指令来运行多个命令,这样可以减少镜像中的层数。例如,可以使用&&符号连接多个命令,以减少镜像层的数量‌。
# 多个RUN会导致多个分层,分层多导致镜像体积过大、构建时间增加以及镜像维护困难等问题
RUN mkdir -p /ruoyi/server/logs \/ruoyi/server/temp \/ruoyi/skywalking/agent# WORKDIR设置工作目录
WORKDIR /ruoyi/server# ENV参数定义变量,供后续脚本调用。变量可写在一行ENV里,也可写在多行ENV里。
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""# 暴露应用端口
EXPOSE ${SERVER_PORT}# 拷贝jar包到容器
# 使用COPY而非ADD除非确实需要自动解压功能
# 如下COPY表示复制当前目录所有文件到容器的/usr/src/myapp目录下
# COPY . /usr/src/myapp
# ADD应用示例:gz扩展名的文件拷贝到容器里并解压
# ADD nginx-1.21.0.tar.gz /usr/local/
# ADD还可以复制远程文件到镜像中
# ADD https://example.com/nginx-1.21.0.tar.gz /usr/local/
# 把我的本地jar包拷贝到容器工作目录
COPY ./target/ruoyi-admin.jar ./app.jar# ENTRYPOINT设置容器启动时执行的命令,最简单的如:
# ENTRYPOINT ["java","-jar","/app/app.jar"]
# 也可复杂一些控制更多的虚拟机参数,如下
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \# 应用名称 如果想区分集群节点监控 改成不同的名称即可#-Dskywalking.agent.service_name=ruoyi-server \#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \-jar app.jar \-XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}# ENTRYPOINT参数可以在运行容器时传参,但会覆盖dockfile脚本里的ENTRYPOINT参数。
# docker run --name demo3D --rm -it --entrypoint ping demo3:test bing.com.cn# ENTRYPOINT命令基本等同CMD命令,这两个命令都支持支持shell、exec两种形式的语法
# https://zhuanlan.zhihu.com/p/548188679?utm_id=0
# 1.shell格式
# ENTRYPOINT command  param1 param2
# 2.exec格式
# ENTRYPOINT ["command", "param1", "param1"]
#通常Docker中推荐使用exec格式语法,原因有二。一方面,shell格式语法下会通过/bin/sh -c来执行命令;另一方面,某些镜像甚至不包含Shell,致使shell格式下的命令无法被正常执行。但使用exec格式时,会无法获取环境变量的值。此时则可以考虑使用shell格式语法

3.编译Dockerfile成镜像。

sudo docker build -t your_image_name:your_tag -f ./your_Dockerfile .

4.运行镜像:

# 单行命令启动,--add-host是为了容器里的jar包能够访问外部的域名资源,我的数据库用了域名进行连接,与开发环境协同。
docker run -d --name container_name -p 8080:8080 --restart=always --add-host www.bingfengspring.com:172.17.0.1 my-java-image
# 多行脚本启动
#!/bin/bash
docker run -d \--name container_name\-p 8080:8080\--restart=always\--add-host www.bingfengspring.com:172.17.0.1my-java-image
  • 不含jar包:适合调试阶段不断更新jar包,重启容器即可。
# 单行命令启动,--add-host是为了容器能够访问外部的域名资源,与开发环境协同。
docker run -d --name container_name -p 8080:8080 -v 宿主机jar包目录:/ruoyi/server --restart=always --add-host www.bingfengspring.com:172.17.0.1 my-java-image
# 多行脚本启动
#!/bin/bash
docker run -d \--name ruoyi_admin_nojar\-p 8080:8080\-v 宿主机jar包目录:/ruoyi/server\--restart=always\--add-host www.bingfengspring.com:172.17.0.1\my-java-image

http://www.ppmy.cn/embedded/108004.html

相关文章

C++学习笔记----6、内存管理(四)---- 通常的内存陷阱(1)

使用new/delete/new[]/delete[]处理动态内存以及底层内存操作是非常容易出错的。对于引起内存有关的问题还特别难以定位。每一个内存泄露与错误指针都有其细微差别。没有能够解决内存问题的银弹。我们就来谈一谈一些通常问题以及能够检测和解决的一些工具。 1、少分配了数据空…

PDF文档处理技巧:如何编辑 PDF文档

如果没有合适的工具,PDF 编辑起来会很棘手。虽然有些工具价格昂贵,但一些免费工具也可以完成这项工作。以下是您需要获得和了解的内容。 如果您曾经尝试编辑可移植文档格式文件 (PDF),那么您几乎肯定会发现它比编辑 Microsoft Word 或 Googl…

Linux云计算学习笔记11 (计划任务)

一.基本概念 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。试想一下,如果系统要求在业务不那么繁忙的半夜进行…

[pytorch] --- 神经网络的基本骨架-nn.Module的使用

1 nn.Module 1.1 nn.Module基本使用 在PyTorch中,nn.Module 类扮演着核心角色,它是构建任何自定义神经网络层、复杂模块或完整神经网络架构的基础构建块。通过继承 nn.Module 并在其子类中定义模型结构和前向传播逻辑(forward() 方法&#…

spring boot项目中配置文件配置mapper*.xml文件路径无效的问题排查记录

常见的原因在此就不描述了,导致此次自定义mapper无法被绑定的原因在于:项目中定义了sqlSessionFactoryBean,但这个Bean里只对dataSource设置了,并未设置MapperLocations,导致在application.properties中虽配置了mybati…

诺瓦星云校招嵌入式面试题及参考答案

SPI 通信有哪些内核接口? 在嵌入式系统中,SPI(Serial Peripheral Interface,串行外设接口)通信通常涉及以下内核接口: 时钟控制接口:用于控制 SPI 时钟的频率和相位。通过设置时钟寄存器,可以调整 SPI 通信的速度以适应不同的外设需求。数据发送和接收接口:负责将数据…

出现dracut-initqueue引导丢失进入dracut界面!

在启动过程中,我们会看到类似下面的画面,提示“Warning:dracut-initqueue timeout-starting”,这是因为没有未找到系统引导文件! 提示: “Warning:dracut-initqueue timeout-starting” “Wa…

ES6基础----Class的使用

目录 1、ES5 中定义类 ---function 2、es5 中定义类的方法,需要在原型(prototype)上定义 3、ES6 出现 Class 用于定义类, Class 定义的类和 function 定义的类功能都大致相同,出现 Class 的原因是想让定义的类更符合面向对象的…