• Springboot项目多模块打包jar移动到指定目录,docker打jar包构建镜像部署并运行


    环境

    springboot:2.7.1
    jdk:12

    前言

    最近想着用docker来部署应用,这就意味着,打jar包时,需要指定打包的位置。并且在每次构建时,能够清除掉旧包,存入新包。

    步骤

    假设你已经有了一个准备部署的项目;就等打包了。

    maven配置

    在父模块的pom.xml中:
    指定start-class(要是项里有多个main方法的话,不指定就会报错)

    <properties>
        <java.version>12java.version>
        <start-class>com.sgy.oceanstars.OceanstarsApplicationstart-class>
    properties>
    
    
    <build>
       <plugins>
          <plugin>
              <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    
                    <outputDirectory>E:\java项目\dockerfile\outputDirectory>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombokgroupId>
                            <artifactId>lombokartifactId>
                        exclude>
                    excludes>
                configuration>
                <executions>
                    <execution>
                        <phase>packagephase>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-clean-pluginartifactId>
                <version>3.0.0version>
                <configuration>
                    
                    
                    
                    <excludeDefaultDirectories>falseexcludeDefaultDirectories>
                    <filesets>
                        <fileset>
                            
                            <directory>E:\java项目\dockerfile\directory>
                            
                            <followSymlinks>falsefollowSymlinks>
                          
                            <useDefaultExcludes>trueuseDefaultExcludes>
                            
                            <includes>
                                <include>*.jarinclude>
                            includes>
                            
                            
                        fileset>
                    filesets>
                configuration>
            plugin>
       plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    上面主要就是配置两个:

    1. 打包时,指定存放目录;
    2. clean时,指定清除的目录和文件;

    效果:

    在这里插入图片描述

    是否需要将多个模块打包成一个jar包?

    这个问题,下午研究了好久,对比下公司的做法,发现,我们并不需要将jar包,合并成一个包。我们只需要将这些相关的包,放在一个目录下即可:保证依赖关系能够被依赖到即可。

    dockerfile打包

    编写Dockerfile

    文件夹路径:E:\java项目\dockerfile
    创建Dockerfile文件

    FROM openjdk:12
    MAINTAINER yutao
    ADD oceanstars-start-1.0.0-SNAPSHOT.jar app.jar
    EXPOSE 8080
    VOLUME /data
    entrypoint java -jar app.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    FROM openjdk:12,表示本镜像的基础镜像是openjdk,版本是12,毕竟要用java命令运行jar包的。docker会从dockerhub拉取对应的镜像,服务器不需要有。

    MAINTAINER yutao,表示镜像的编写者。

    ADD oceanstars-start-1.0.0-SNAPSHOT.jar app.jar,表示将oceanstars-start-1.0.0-SNAPSHOT.jar,也就是项目jar包,拷贝进镜像,并命名为app.jar。如果不拷贝,镜像就没jar包可运行了。

    EXPOSE 8080,表示镜像将对外暴露8080端口,也就是编写项目时的运行端口。

    VOLUME /data,表示将镜像的/data文件夹声明为匿名卷。这样做是因为,项目会读写文件系统的/data文件夹,如果不声明,那么项目运行后只会对镜像内的虚拟目录/data读写,而不会对主机的目录读写,等关闭容器后,写的内容就没了。所以,声明匿名卷是为了将写操作持久化。仅仅在dockerfile里声明还不够,在运行容器时还需要设置匿名卷对应的主机目录,这点我们下面会谈到。

    ENTRYPOINT java -jar app.jar,表示容器运行后执行的命令。这里就只需要运行jar包就行了。

    构建镜像

    编写了Dockerfile,就可以构建镜像了。

     docker build -t test_app:1.0.0 .
    
    • 1
    • test_app是镜像的名字,-t代表给镜像打的标签,后面的:0.1意思就是这个镜像版本是0.1。如果不打标签,镜像的标签会自动设为latest。

    • 最后的一个’.‘代表Dockerfile所在位置,因为就在当前目录下,所以直接是一个’.'就行了。

    • docker会自动拉取openjdk。一会出现“Successfully built 7717b14bfe0a”,说明构建成功。

    运行容器

    接下来运行容器。

     docker run -d --name test_app -v E:\java项目\dockerfile\volumeData:/data --net=host -p 8080:8080 test_app:1.0.0
    
    • 1
    • -d指在后台运行。

    • –name为容器起名。

    • -v指定容器匿名卷挂载的目录。这里E:\java项目\dockerfile\volumeData:/data 代表将主机的E:\java项目\dockerfile\volumeData 对应到容器的/data ,也就是说,容器对/data 目录的读写也就是对主机的E:\java项目\dockerfile\volumeData读写。

    • –net=host指定容器的网络模式。host是最简单的模式,容器和主机共用一个网络,会互相占用端口。由于项目简单,我就没有再研究其他模式了,想研究的话可以看看官网教程。

    • -p 8080:8080指定端口映射。这里简单的将主机的8080端口映射到容器的8080端口。如果想要多个web程序运行在同一主机,不需要改代码里的运行端口,直接将主机的不同端口映射到容器的8080即可。

    • 最后是容器使用的镜像,也就是刚刚构建好的test_app:1.0.0。

    就这样,容器成功运行了。只要docker start/stop就能控制程序运行,部署新版本时,也只要将jar包再上传到目录下,重新构建即可。

    参考地址:

    Java——maven打完jar包之后将jar包放到指定位置总结

    通过maven-clean-plugin插件清除指定的目录

    docker打包jar包,构建镜像部署运行

  • 相关阅读:
    vue开发环境准备
    信息学奥赛一本通:1157:哥德巴赫猜想
    【SSM】SpringBoot 统一功能处理(重点:Spring 拦截器实现与原理)
    嵌入式Linux应用开发-文件 IO
    【毕业设计】深度学习手势识别检测系统 - python
    简单的个人博客网站设计 静态HTML个人博客主页 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页设计作业
    vue首页加载优化,vue使用cdn加载插件,vue cdn优化
    C++中迭代器的使用
    信驰达科技加入车联网联盟(CCC),推进数字钥匙发展与应用
    实际业务中使用策略模式对代码进行重构
  • 原文地址:https://blog.csdn.net/u013066244/article/details/126823335