基于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

相关推荐
Lxinccode7 分钟前
docker(25) : 银河麒麟 V10离线安装docker
java·docker·eureka·银河麒麟安装docker·银河麒麟安装compose
hoiii1877 分钟前
挂载配置文件以Docker启动Redis服务
redis·docker·eureka
遇见火星7 分钟前
LINUX的 jq命令行处理json字段指南
java·linux·json·jq
令狐少侠20118 分钟前
docker启动失败
运维·docker·容器
高山上有一只小老虎30 分钟前
等差数列前n项的和
java·算法
rockmelodies34 分钟前
东方通安装
java
避避风港1 小时前
Java 抽象类
java·开发语言·python
初学小白...1 小时前
JVM入门知识点
java·服务器·jvm
C++chaofan1 小时前
基于session实现短信登录
java·spring boot·redis·mybatis·拦截器·session
摇滚侠1 小时前
idea 刷新maven,提示java.lang.RuntimeException: java.lang.OutOfMemoryError
java·maven·intellij-idea