Java(SpringBoot)项目打包(构建)成Docker镜像的几种常见方式
作者:小简(JanYork)
前置说明
- 最为原始的打包方式
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插件
来自
优点:不需要本地安装
Docker
,也不需要写DockerFile
,Jib
可以直接推送到指定的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
点击打包,讨厌命令。
注意:需要本地有
Docker
,并且开启远程连接,Windows
的Docker
安装小简上一篇文章写过的,可以看看,Linux
的没写。
好用多了,一次成功。
还是这个最好用,推荐!!!
总结
小简选择的是最后一个,第一个也还行吧,但是Google
那个不需要本地有Docker
环境,第一个我还是开着魔法(梯子)打包的,最后一个挺好的。
到此这篇关于Java(SpringBoot)项目打包(构建)成Docker镜像的几种常见方式的文章就介绍到这了,更多相关SpringBoot打包成Docker镜像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!