Java(SpringBoot)项目打包(构建)成`Docker`镜像的几种方式_java项目打包成docker镜像
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前置说明
- 最为原始的打包方式
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
环境第一个我还是开着魔法(梯子)打包的最后一个挺好的。
看情况选择的很久没更新啦越来越懒了嘿嘿下篇再见。