当前位置: 首页 > article >正文

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

文章目录

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

应用场景

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

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

1.编译项目成jar包

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

2.构建Dockerfile文件

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

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

精简版-含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包

  • 比较适用于调试状态需要不断更新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包

# 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.运行镜像:

  • 含jar包
# 单行命令启动,--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.1
	my-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.kler.cn/a/292155.html

相关文章:

  • C++创建型设计模式体现出的面向对象设计原则
  • Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新
  • Zero、Zero-Offload、Zero-Infinity是什么
  • SASS 控制指令详解@for、@if、@each、@while
  • Excel模板下载\数据导出
  • NodeJS 百度智能云文本转语音(实测)
  • BZOJ2959 长跑(LCT维护边双后缩点)
  • Rust 赋能前端:PDF 分页/关键词标注/转图片/抽取文本/抽取图片/翻转...
  • JVM系列(七) -对象的内存分配流程
  • 场外个股期权的风险有哪些方面?
  • 数据库课程设计mysql---图书管理系统详细的设计文档和需求文档
  • NTC阻值与温度计算公式
  • Redis 常用命令总结
  • 【Django-Minio-Storage 使用教程】
  • EXCEL表格如何实现数字自动加减乘数(简单有效)
  • 初识redis(String,Hash,List,Set,SortedSet)
  • JVM 的类加载机制和双亲委派机制
  • 【Rust光年纪】极致性能体验:数据管道实现、虚拟化列表和网格布局美化完全攻略
  • 嵌入式day39
  • 828华为云征文|基于Flexus云服务器X实例的应用场景-定时给微信群中推送新闻简报
  • 【Python】企业排名、地域分布与词云分析可视化
  • 23种设计模式(四) —— 手写实现 Factory Method 模式 (将具体交给子类)
  • charles使用ssl证书抓包https请求失败解决方案
  • ffmpeg音视频开发从入门到精通——常用结构体介绍(一)
  • Node.js sqlite3:Statement对象详解
  • Ubuntu下pdf操作