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环境,第一个我还是开着魔法(梯子)打包的,最后一个挺好的。

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

相关文章
|
18天前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
168 8
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
114 10
|
1月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
186 3
|
1月前
|
机器学习/深度学习 人工智能 监控
Java与AI模型部署:构建企业级模型服务与生命周期管理平台
随着企业AI模型数量的快速增长,模型部署与生命周期管理成为确保AI应用稳定运行的关键。本文深入探讨如何使用Java生态构建一个企业级的模型服务平台,实现模型的版本控制、A/B测试、灰度发布、监控与回滚。通过集成Spring Boot、Kubernetes、MLflow和监控工具,我们将展示如何构建一个高可用、可扩展的模型服务架构,为大规模AI应用提供坚实的运维基础。
171 0
|
1月前
|
人工智能 Java 物联网
Java与边缘AI:构建离线智能的物联网与移动应用
随着边缘计算和终端设备算力的飞速发展,AI推理正从云端向边缘端迁移。本文深入探讨如何在资源受限的边缘设备上使用Java构建离线智能应用,涵盖从模型优化、推理加速到资源管理的全流程。我们将完整展示在Android设备、嵌入式系统和IoT网关中部署轻量级AI模型的技术方案,为构建真正实时、隐私安全的边缘智能应用提供完整实践指南。
217 3
|
1月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
293 4
|
1月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
236 0
|
1月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
257 41
|
2月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
821 8
|
2月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
761 1