IDEA 使用 Dockerfile Maven Plugin 发布镜像
之前的博客介绍了 IDEA 使用 docker-maven-plugin 发布镜像,当时没有使用 Dockerfile 文件,不够灵活。其实 docker-maven-plugin 也可以使用 Dockerfile 生成和发布镜像,本篇博客介绍另一个插件 dockerfile-maven-plugin,该插件是必须要使用 Dockerfile 文件生成和发布镜像的。在博客的最后,会对两种插件进行简单的对比,大家可以根据自身情况选择合适的插件。
之前的博客地址为:https://www.cnblogs.com/studyjobs/p/18017752.html
一、dockerfile-maven-plugin 的坑
本篇博客仍然使用之前的 fileupdown 的工程项目进行测试,在博客最后会提供源代码下载
首先看一下项目的 pom 文件内容,重点看一下 plugin 的配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<groupId>com.jobs</groupId>
<artifactId>fileupdown</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<!--
这里将 finalName 配置为 fileupdown,
这样打包后的 jar 包名称就为:fileupdown.jar
-->
<finalName>fileupdown</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- dockerfile的maven插件官网:https://github.com/spotify/dockerfile-maven -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.6</version>
<configuration>
<!--构建后的 docker 镜像的名称,这里按照可以往私有仓库上传的命名格式-->
<repository>192.168.136.128:8050/${project.artifactId}</repository>
<!--构建后的 docker 镜像的版本-->
<tag>${project.version}</tag>
<buildArgs>
<!--Maven 构建的 jar 包相对路径和名称-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
对于 dockerfile-maven 插件,有两个坑必须要注意:
1 第一个坑:我们需要配置 DOCKER_HOST 环境变量
从上面的 dockerfile-maven-plugin 配置内容,可以发现:没有提供 dockerhost 的配置内容,而且也无法配置。默认情况下,dockerfile-maven-plugin 会连接本机 windows 电脑上安装的 docker 进行生成镜像,因为我们的 IDEA 运行在 windows 电脑上。但是绝大多数情况下是不会在 windows 电脑上安装 docker 的。因为一方面 windows 上安装 docker 比较麻烦,比较耗费本机性能;另一方面让每个开发人员在自己的 windows 电脑上安装 docker 没那个必要。
因此我们需要配置 DOCKER_HOST 环境变量,指定我们需要使用服务器上的 docker 来生成镜像
我在自己的虚拟机 192.168.136.128 上已经安装好了 docker,并且配置允许远程访问,设置的端口是 2375
有关如何配置 docker 远程访问,可以参考我之前的博客:https://www.cnblogs.com/studyjobs/p/18017752.html
2 第二个坑:设置好 DOCKER_HOST 环境变量后,必须注销电脑重新登录,或者重启电脑上,才能生效
我们离线安装 java 或 maven,只要配置了环境变量,重新打开 cmd 窗口,就可以运行相关命令
但是我们配置好了 DOCKER_HOST 环境变量后,必须注销当前电脑用户,重新登录电脑系统,或者重启电脑才能生效。
二、编写 Dockfile 文件
默认情况下,需要在项目的根目录编写 Dockerfile 文件,即跟 pom 处在同一个目录中,如下图所示:
编写的 Dockerfile 文件的内容为:
# 注意:该 Dockfile 文件放置在项目的根目录,即:跟 pom.xml 同层级的目录中
# 设置JAVA版本,如果需要生成图片,则需要使用 java:8 这个基础镜像
FROM java:8-alpine
# 指定存储卷, 任何向/tmp写入的信息都不会记录到容器存储层
VOLUME /tmp
# 拷贝运行JAR包,这里可以引用 pom 文件中的 buildArgs 中 JAR_FILE 变量
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
# 设置JVM运行参数, 这里限定下内存大小,减少开销
ENV JAVA_OPTS="-server -Xms256m -Xmx512m"
# 指定环境变量参数,方便创建容器时传参
ENV PARAMS=""
# 入口点, 执行JAVA运行命令
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]
接下来我们就可以在右侧,分别双击 clean、package、dockerfile:build、dockerfile:push 命令即可实现生成镜像,上传到私有仓库
当然 dockerfile-maven-plugin 仍然有这个问题:重复运行 clean、package、dockerfile:build 命令后,如果生成的镜像 tag 相同的话,之前生成的镜像的 repository 和 tag 都会变成 none,如下图所示:
三、docker-maven-plugin 使用 Dockfile 文件
docker-maven-plugin 插件也可以使用 Dockfile 文件生成镜像,其 pom 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<groupId>com.jobs</groupId>
<artifactId>fileupdown</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<!--
这里将 finalName 配置为 fileupdown,
这样打包后的 jar 包名称就为:fileupdown.jar
-->
<finalName>fileupdown</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<!--配置 docker 的地址,当运行 docker build 命令时构建并上传镜像-->
<dockerHost>http://192.168.136.128:2375</dockerHost>
<!--配置最终生成的镜像名称-->
<imageName>192.168.136.128:8050/${project.artifactId}:${project.version}</imageName>
<!--配置 Dockerfile 所在的目录,basedir 表示在项目的根目录-->
<dockerDirectory>${basedir}/</dockerDirectory>
<buildArgs>
<!--Maven 构建的 jar 包相对路径和名称-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
在使用过程中发现,如果进行 clean、package 之后,重复运行 dockerfile:build 命令会报错,所以 dockerfile:build 命令只能运行一次。如果想多次运行,必须要新运行 clean、package 命令,然后才能运行 dockerfile:build 命令。
四、两种插件的对比
- dockerfile-maven-plugin 需要配置 DOCKER_HOST 环境变量,而且要注销重新登录或重启电脑;docker-maven-plugin 不需要配置环境变量,可以在 pom 文件中配置 dockerhost 内容,随时调整,不需要注销登录或重启电脑。
- docker-maven-plugin 比 dockerfile-maven-plugin 多一个命令 docker:removeImage ;这个命令使用很方便,当需要重复生成相同 repository 和 tag 的镜像时,可以先运行该命令删除服务器上的镜像,然后再生成,避免在服务器上保留之前 repository 和 tag 都为 none 的镜像。
综上而言,我个人比较喜欢使用 docker-maven-plugin 插件,本篇博客的源代码 demo 下载地址如下,里面有各种测试的 pom 文件:
https://files.cnblogs.com/files/blogs/699532/fileupdown.zip