zoukankan      html  css  js  c++  java
  • 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

    纵有白头俱老意,奈何缘浅路芊芊.
  • 相关阅读:
    Python全栈之路系列----之-----并发编程Process类
    Python全栈之路系列----之-----网络编程(粘包与命令执行/数据传输)
    Python全栈之路系列----之-----网络编程(套接字)
    Python全栈之路系列----之-----面向对象5(封装/访问限制)
    Python全栈之路系列----之-----面向对象2(命名空间/组合)
    6. EF Core 数据库实体关系外键的配置
    5.EF Core 数据库映射模型隐藏属性配置
    4.EF Core 数据库映射模型基本配置
    3.EF Core 隐射表的几种默认约束
    2.EF Core添加数据库配置的几种方式
  • 原文地址:https://www.cnblogs.com/hanby/p/15293614.html
Copyright © 2011-2022 走看看