Java的jar包构建成docker镜像并运行
结构如下

把jar和Dockerfile放到一个文件,不在一个文件下会报错文件找不到
创建一个构建文件
buildimage.sh
vi /home/hanby/buildimage.sh
echo "运行创建镜像脚本"
docker build -t gateway:2.4.3 .
Dockerfile创建镜像
vi /home/hanby/Dockerfile
# 版本信息
#java:latest 为centos官方java运行环境镜像,600多M ,可以提前pull到主机本地
FROM java:latest
#MAINTAINER "指定作者或其他信息"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /jeecg-cloud-gateway
WORKDIR /jeecg-cloud-gateway
#实际上可以配置成变量
ADD jeecg-cloud-gateway-2.4.3.jar /usr/local/jar/
RUN mv /usr/local/jar/jeecg-cloud-gateway-2.4.3.jar /usr/local/jar/gateway.jar
#开启内部服务端口 cicd-demo 项目端口
EXPOSE 9999
CMD ["java","-jar","/usr/local/jar/gateway.jar"]
run.sh 创建
vi /home/hanby/run.sh
echo "移除原本gateway镜像"
docker rm -f gateway
echo "运行新的gateway镜像,端口为9999"
#docker run --name="gateway" -p 9999:9999 -d gateway:2.4.3
docker run -d --restart=always --name gateway -v /home/jenkins-jar/buildgatewayImage/logs/:/logs/gateway/ -p 9999:9999 gateway:2.4.3
执行 ./buildgatewayImage.sh

./run-gateway-9999.sh

运行结果

出现的问题解决方法
如果用127.0.0.1访问docke启动的mysql,会报错,应该使用宿主机ip,或者在启动命令中添加--net=host,使容器和宿主机ip一致
如果出现宿主机和容器时间一致,但日志时间相差8小时,则在启动命令中添加如下:
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
用链接让容器使用系统时区
如果是springboot项目,也可以在启动类添加
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

然而jar的大小总的来说还是很大,所有使用瘦身打包,可以把每个jar分离为依赖组件lib目录和一个业务jar来进行部署,优化单个jar文件大小到一两百KB。
但是对于很多个微服务,每个服务一个jar和一个lib目录文件,首次部署也差不多需要传输一两个GB文件。
所以合并所有模块依赖jar到同一个lib目录,一般由于各模块项目依赖jar重叠程度很高,合并所有服务部署文件总计大小基本也就两三百MB
启动过程不再需要 -Djava.ext.dirs=lib 参数定义,所有微服务jar引用所有项目合并依赖组件的公共目录,部署文件总计大小一般在两三百MB,通过定制每个微服务jar文件中的META-INFO/MANIFEST文件中的Class-Path明确指明依赖版本组件类,解决各微服务不同组件版本冲突问题。
微服务配置,可以给父pom配置,如果其中有不需要瘦身打包的,则需要单独配置每一个需要瘦身打包的服务,也可以排除不需要瘦身打包,怎样方便怎样来
父pom配置
<build>
<finalName>${project.artifactId}</finalName>
<!--
特别注意:
项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
-->
<plugins>
<!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--
各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
详见各子模块中 boot-jar-output 属性定义
-->
<outputDirectory>${boot-jar-output}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<silent>false</silent>
</configuration>
</execution>
</executions>
</plugin>
<!-- Spring Boot模块jar构建 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includes>
<!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
<include>
<groupId>null</groupId>
<artifactId>null</artifactId>
</include>
</includes>
<layout>ZIP</layout>
<!--
基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
详见各子模块中boot-jar-output属性定义
-->
<outputDirectory>${boot-jar-output}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--###################瘦身打包######################################-->
子pom配置
<!--###########瘦身打包###########文件路径自己定义即可-->
<properties>
<java.version>8</java.version>
<boot-jar-output>../toImageJar</boot-jar-output>
</properties>

打包结果如下

docker 配置
Dockerfile 修改
# 版本信息
#java:latest 为centos官方java运行环境镜像,600多M ,可以提前pull到主机本地
FROM java:latest
#MAINTAINER "指定作者或其他信息"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#RUN mkdir -p /jeecg-cloud-pay
#在jar文件目录下创建一个lib
RUN mkdir -p /usr/local/jar/lib
#WORKDIR /jeecg-cloud-pay
#实际上可以配置成变量
ADD jeecg-cloud-flh-pay.jar /usr/local/jar/
#COPY lib /usr/local/jar/lib
RUN mv /usr/local/jar/jeecg-cloud-flh-pay.jar /usr/local/jar/pay.jar
#开启内部服务端口 pay项目端口
EXPOSE 7006
CMD ["java","-Xms1024m","-Xmx1024m","-jar","/usr/local/jar/pay.jar"]
run-pay-7006.sh 配置
echo "移除原本pay镜像"
docker rm -f pay
echo "运行新的pay镜像"
docker run -d --restart=always --name pay \
--net=host \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /data/soft/imageAPP/logs/pay/:/logs/pay/ \
-v /data/soft/imageAPP/lib:/usr/local/jar/lib \ 映射目录,如此就只需要一个lib即可,也可以copy lib到容器(麻烦,必须在每个容器里面复制一份)
-p 7006:7006 pay:2.4.3
其他打包方式参考 https://mp.weixin.qq.com/s/hstk9tXzKt-Up20kD5x0fg
Java的jar包构建成docker镜像并运行的更多相关文章
- 将jar包制作成docker镜像
将jar包制作成docker镜像1.准备可运行jar包2.建立Dockerfile文件 文件内容: FROM java:8VOLUME /tmpADD xxx-sendemail-0.0.1-SNAP ...
- 把java(springboot)程序打包docker镜像
前言:要在docker运行java(jar包)程序,就要把程序打包成docker镜像(以下简称镜像),可以先理解为镜像就是jar包 打包需要程序代码,java本身的打包环境(包括jdk和maven), ...
- java 执行 jar 包中的 main 方法
java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...
- Java常用jar包用途
Java常用jar包用途: USAGE INDEX JAR NAME USAGE 1 ASM asm-2.2.3.jar ASM字节码库 2 ASM asm-commons-2.2.3.jar ASM ...
- (转)java 从jar包中读取资源文件
(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...
- Python3.5调用Java的jar包
声明:这个是在一个博客上看到的,过了俩星期了突然找不到原博客了,如果原来的博主看到,请联系我删除~ 主要是怕自己忘记,所以在此记录: 环境 Python3.5+JDK1.8 安装命令:python3 ...
- Java axis2.jar包详解及缺少jar包错误分析
Java axis2.jar包详解及缺少jar包错误分析 一.最小开发jar集 axis2 开发最小jar包集: activation-1.1.jar axiom-api-1.2.13.jar ax ...
- java执行jar包出错:Unable to access jarfile
java执行jar包出错:Unable to access jarfile 错误的原因有多种: 1.一般都是路径不正确.在Windows中,正确的路径类似于: java -jar "D:\W ...
- java 生成jar包并保留注释
java 生成jar包并保留注释 CreationTime--2018年7月17日08点32分 Author:Marydon 1.选中java项目-->右键-->Export: 2.去 ...
随机推荐
- SQLserver 2014使用Convert()函数获取时间
select convert(char(100),GetDate(),120) as Date 第3个参数就是用来设置日期类型数据的显示样式的,下面介绍几种样式的参数 SELECT CONVERT(v ...
- mysql的事务详解
事务及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性. 原子性(Atomicity) :事务是一个原子操作单元,其对数据的修改,要么全都执 ...
- 资源相关视图(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 这里就扯到资源了,资源是啥意思?如果是教科书,怕又是有一个名词解释要背吧,吼吼--其实这个资源在这里的意思基本上猜就能猜到 ...
- Asp.NetCore3.1开源项目升级为.Net6.0
概述 自从.Net6.0出来后,一直想之前开发的项目升级.Net6.0,有时想想毕竟中间还跨了个5.0版本,升级起来不知道坑大不大,最近抽时间对升级的方案做了些研究,然后将代码升级为.Net6.0.本 ...
- js实现数组扁平化
数组扁平化的方式 什么是数组扁平化? 数组扁平化:指将一个多维数组转化为一个一维数组. 例:将下面数组扁平化处理. const arr = [1, [2, 3, [4, 5]]] // ---> ...
- BitBake使用攻略--从HelloWorld讲起
目录 写在前面 1. 什么是BitBake 2. BitBake的安装 3. 使用BitBake构建一个HelloWorld工程 后续 写在前面 <BitBake使用攻略>系列文章将从今天 ...
- lvm 扩容
总体思路: 逻辑卷要扩容,先扩容对应卷组, 扩容卷组的方式: 添加新的物理卷(磁盘已有分区,扩容后新建分区:或者新加了一块硬盘创建了新的物理卷),vgextend myvg /dev/vdb 扩容,/ ...
- c++设计模式概述之代理
代码写的不规范,目的是缩短文章篇幅,实际中请不要这样做. 1.模式的结构 代理模式的主要角色如下: A.抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法. B.真实主 ...
- c++之可变参数格式化字符串(c++11可变模板参数)
本文将使用 泛型 实现可变参数. 涉及到的关见函数: std::snprintf 1.一个例子 函数声明及定义 1 // 泛型 2 template <typename... Args> ...
- 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...