Java(SpringBoot)项目打包(构建)成Docker镜像的几种方式

简介: 也就是使用Docker的打包命令去打包,麻烦,我这里不多说。

前置说明

  • 最为原始的打包方式
  • spring-boot-maven-plugin插件
  • jib-maven-plugin插件
  • dockerfle-maven-plugin插件

最为原始的方式

也就是使用Docker的打包命令去打包,麻烦,我这里不多说。

spring-boot-maven-plugin插件打包

SpringBoot自己内置了一个Docker镜像打包工具,在spring-boot-starter-parent中,我们无需多余的设置。

优点:不需要写DockerFile,Spring建议的安全、内存、性能等问题都不需要管。

jib-maven-plugin插件

来自Google的一款打包插件。

优点:不需要本地安装Docker,也不需要写DockerFileJib 可以直接推送到指定的Docker仓库。

dockerfle-maven-plugin插件

需要写DockerFile也需要本地Docker环境,但是恰恰是最好用的,最稳定的,最自由把控的。

优点:稳定,不受网络限制,DockerFile自己写,自由度很高,想怎么改怎么改,个人推荐这个。

SpringBoot打包镜像

我们无需引入依赖,SpringBoot自带了。

打包命令:

mvn spring-boot:build-image

但是我不喜欢用命令,IDEA都给你可视化了,何必敲命令呢?而且命令还需要设置Maven环境变量。

网络异常,图片无法展示
|

就和打JAR包一样,我们点一下就可以。

但是SpringBoot的打包会因为网络(不通畅),而导致失败。

打包完成是这样:

网络异常,图片无法展示
|

我们去查看本地镜像有没有。

网络异常,图片无法展示
|

运行测试一下。

网络异常,图片无法展示
|

说实话我运行失败了,因为我项目里面有一下东西它不好搞,比如微信支付的证书文件和KEY文件,一般的SpringBoot项目可以,但是我这个恰恰不行,我需要自己写DockerFile去创建卷映射才好。

JIB打包镜像

配置插件依赖:

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.toemail.smtp.ToEmailApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>3.3.1</version>
                <configuration>
                    <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
                    <from>
                        <!--基础镜像名称(建议使用国内公开镜像,下载速度快,更稳定) -->
                        <image>java:8u172-jre-alpine</image>
                    </from>
                    <to>
                        <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
                        <image>demo:${project.version}</image>
                    </to>
                    <!--容器相关的属性-->
                    <container>
                        <!--jvm内存参数-->
                        <jvmFlags>
                            <jvmFlag>-Xms4g</jvmFlag>
                            <jvmFlag>-Xmx4g</jvmFlag>
                        </jvmFlags>
                        <!--要暴露的端口-->
                        <ports>
                            <port>8899</port>
                        </ports>
                    </container>
                </configuration>
            </plugin>

我这里用的目前最新版本。

网络异常,图片无法展示
|

另外,很多配置我都写了注释,如果你想了解更多可以查一下JIB的相关文档。

命令

mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild

IDEA

网络异常,图片无法展示
|

报错

如果出现这错误:

网络异常,图片无法展示
|

就添加以下配置:

网络异常,图片无法展示
|

还是报错

网络异常,图片无法展示
|

好像是它这个官方仓库需要认证登录,我靠,我真不喜欢这破插件,垃圾(暗暗骂道)。

突然解决

网络异常,图片无法展示
|

这个镜像,需要指定具体仓库URL地址的。

但是我现在这个不行,所以我要换一个阿里的仓库。

网络异常,图片无法展示
|

改成了这样:

<to>
  <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image>
</to>

阿里云有时候私有仓库需要密码,也可以换成其他私有仓库。

<from>
            <image>registry.cn-qingdao.aliyuncs.com/jibjava/jibfirst</image>
            <auth>
              <username>阿里云账号</username>
              <password>阿里云密码</password>
            </auth>
          </from>

XML标签详解

from:拉取的镜像的配置,默认为gcr.io/distroless/java

to:要生成的镜像的配置

image:拉取或生成的镜像名称

auth: 认证信息,分别为用户名和密码

container: 容器的属性

jvmFlgs: JVM 容器的参数,和 Dockerfile 的 ENTRYPOINT作用相同

mainClass: 启动类限定名

args: main 方法的传入参数

ports: 容器暴露的端口,和 Dockerfile 的EXPOSE作用相同

成功

网络异常,图片无法展示
|

网络异常,图片无法展示
|

DockerFileMaven打包

DockerFile

FROM c9katayama/java8:latest
# 创建目录
RUN mkdir -p /dashboard
# 拷贝文件
COPY dashboard.jar /dashboard/dashboard.jar
# 暴露端口
EXPOSE 8099
# 启动命令
CMD ["java", "-jar", "/dashboard/dashboard.jar"]

DockerFile不多说,请自行学习。

依赖展示:

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.11</version>
                <dependencies>
                    <dependency>
                        <groupId>javax.activation</groupId>
                        <artifactId>javax.activation-api</artifactId>
                        <version>1.2.0</version>
                        <scope>compile</scope>
                    </dependency>
                </dependencies>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                </configuration>
            </plugin>

但是这一段插件的XML别用,因为这是rocketmq可视化控制台的官方写的,你可以自己配置。

网络异常,图片无法展示
|

正常的一般插件的XML就这样:

<plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!-- 指定 Dockerfile 路径-->
                <dockerDirectory>${basedir}/docker</dockerDirectory> 
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中 -->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>

其余配置可以自行浏览器搜索一下:docker-maven-plugin配置项

构建命令

mvn package

尝试打包

我这里直接IDEA点击打包,讨厌命令。

535754688423ea6fe30b677ed8c27ec7_Uac2JQAt.png

注意:需要本地有Docker,并且开启远程连接,WindowsDocker安装小简上一篇文章写过的,可以看看,Linux的没写。

好用多了,一次成功。

eb24177a3263d456e2c92df002d80f4e_3I9m8EbU.png

网络异常,图片无法展示
|

还是这个最好用,推荐!!!

总结

小简选择的是最后一个,第一个也还行吧,但是Google那个不需要本地有Docker环境,第一个我还是开着魔法(梯子)打包的,最后一个挺好的。

看情况选择的,很久没更新啦!越来越懒了,嘿嘿,下篇再见。

相关文章
|
8天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
61 26
|
16天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
35 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
4天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
39 13
|
20天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
31 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
12天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
18天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
Java Docker 容器
本文简单介绍利用springboot jar包打docker镜像并运行
本文简单介绍利用springboot jar包打docker镜像并运行
235 0
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
173 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
111 62
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
71 2