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 来生成镜像

image

我在自己的虚拟机 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 处在同一个目录中,如下图所示:

image

编写的 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 命令即可实现生成镜像,上传到私有仓库

image

当然 dockerfile-maven-plugin 仍然有这个问题:重复运行 clean、package、dockerfile:build 命令后,如果生成的镜像 tag 相同的话,之前生成的镜像的 repository 和 tag 都会变成 none,如下图所示:

image


三、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


posted @ 2024-03-06 22:44  乔京飞  阅读(7006)  评论(0编辑  收藏  举报