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

文章目录

应用场景

部署多版本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

相关推荐
毕设源码-赖学姐9 分钟前
【开题答辩全过程】以 基于Springboot的智慧养老系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
jamesge201011 分钟前
限流之漏桶算法
java·开发语言·算法
jvstar12 分钟前
JAVA面试题和答案
java
冷雨夜中漫步13 分钟前
OpenAPITools使用——FAQ
android·java·缓存
9坐会得自创18 分钟前
使用marked将markdown渲染成HTML的基本操作
java·前端·html
Hello.Reader39 分钟前
Flink ML 线性 SVM(Linear SVC)入门输入输出列、训练参数与 Java 示例解读
java·支持向量机·flink
oioihoii39 分钟前
C++数据竞争与无锁编程
java·开发语言·c++
最贪吃的虎39 分钟前
什么是开源?小白如何快速学会开源协作流程并参与项目
java·前端·后端·开源
资生算法程序员_畅想家_剑魔40 分钟前
Java常见技术分享-16-多线程安全-并发编程的核心问题
java·开发语言
We....40 分钟前
Java SPI 机制
java·开发语言