Idea集成docker插件完成镜像打包推送操作

发布时间 2023-12-20 17:55:32作者: 我若安好,便是晴天

一、配置Docker服务器

  高版本的Idea默认已经集成了Docker插件,我们只需要按图配置好Docker服务器即可。因为dockerfile-maven-plugin插件的作用只是避免我们直接进行Docker操作,最终的镜像构建还得是docker服务器来完成,因此需要为插件指定Docker服务器。下图的TCP套接字链接到Docker服务器开放远程端口,通过对该端口发送相关指令来完成镜像的构建。

 完成以上配置后,可以在Idea的服务窗口看到已经链接到Docker服务器的Docker服务,可以直接在该界面进行docker命令操作,如图:

 二、配置DOCKER_HOST环境变量

  mvn命令的执行方式有cmd窗口、Idea的终端、Idea集成maven插件窗口3种,这3种方式运行mvn dockerfile 打包命令依赖于DOCKER_HOST环境变量来查找Docker服务器。如果不配置该环境变量,则默认使用本地的Docker服务器,如果本地没有安装,则会引发找不到Docker引擎的异常。

 三、配置dockerfile-maven-plugin插件

  在maven的根pom.xml中的build.plugins节点下添加dockerfile-maven-plugin插件的配置。

           <!-- docker打包插件,groupId、artifactId、version表示插件自生的版本信息 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>${dockerfile-maven-plugin.version}</version>
                <configuration>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <!-- 是否使用maven配置(仓库账号密码)来进行推送认证 -->
                    <repository>${docker.image.prefix}/qrcode-admin</repository> <!-- 指定镜像构建后要推送的仓库地址 -->
                    <tag>1.1.0_prod</tag>  <!-- 指定构建镜像的版本tag -->
                    <buildArgs> <!-- 构建参数,该节点下的参数将在构建时传递给Dockerfile文件,与文件中ARG声明的变量对应 -->
                        <JAR_FILE>target/qrcode-admin.jar</JAR_FILE>
                    </buildArgs>
                    <skipTags>true</skipTags> <!-- 跳过默认标记 -->
                    <useCache>false</useCache> <!-- 关闭缓存机制 -->
                    <forceTag>true</forceTag> <!-- 强制创建新标记 -->
                    <verbose>true</verbose> <!-- 输出更详细信息 -->
                    <pushImage>true</pushImage> <!-- 是否将镜像推送到Docker Registry -->
                    <contextDirectory>/path/</contextDirectory> <!-- 指定构建的上下文目录,该目录中的文件和目录会被复制到Docker镜像中。默认情况下dockerfile-maven-plugin会将Maven项目的根目录作为构建上下文目录-->
                    <dockerfile>src/main/docker/Dockerfile</dockerfile><!-- Dockerfile所在目录路径 -->
                   <additionalBuildArgs>--no-cache=true --pull=true</additionalBuildArgs> <!-- 添加其他构建参数 -->
                </configuration>
            </plugin>

 四、编写Dockerfile文件并放入指定目录

   根据实际需求编写Dockerfile文件后,应该将Dockerfile文件应该放在Maven项目的根目录下或者src/main/docker目录下,这是默认的dockerfile-maven-plugin所查找的路径。如果不在这两个目录下,则需要使用configuration.dockerfile标签指定文件的路径。以下是dockerfile文件示例:

FROM openjdk:8-jre
MAINTAINER sjht xxx@qq.com

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

   dockerfile文件是根据他的特定语法生成的,语法关键字有FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD,使用说明如下:

# Base images 基础镜像
FROM centos

#MAINTAINER 作者姓名和邮箱
MAINTAINER zqf<92973322@qq.com> 

#ENV 设置环境变量,可通过 $变量名 引用
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压,这与COPY命令差不多,区别是COPY不会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd,登录时切换到的目录
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#挂在数据卷
VOLUME /data : /usr

#镜像被子镜像继承后构建时,运行的命令
ONBUILD  ["nginx"]
#EXPOSE 映射端口 
EXPOSE 80 

#CMD 容器启动时要运行的命令,如果有多个CMD则前面的会被覆盖,也会被dockr run 后面的脚本参数替换 
CMD ["nginx"]

#容器启动时要运行的命令,有多个时会追加执行命令,而不会CMD那样被覆盖
ENTRYPOINT ["nginx"]

 六、绑定Docker命令到Maven的生命周期

  maven的生命周期包括如下几个阶段:

  1、清理:删除以前编译得到的旧class字节码文件,为下一次编译做准备。

  2、编译:将java源程序编译为class字节码文件。

  3、测试:自动调用junit程序进行自测。

  4、报告:显示测试程序执行的结果。

  5、打包:将编译好的class字节码文件打包成war、jar包。

  6、安装:将自己的工程安装到maven仓库中指定的位置,才能供其他模块使用。

  7、部署:将jar、war放到生产环境下运行。

  maven本质上是只是一个插件框架,它的核心并不执行任何具体的构建任务,全部任务都是由插件来完成的。构建过程的每一个步骤都都对应一个插件来负责,例如清理阶段由内置插件maven-clean-plugin的目标clean完成清理操作。Maven提供了Build plugins、Reporting plugins两种类型的插件。Build plugins在构建时执行,Reporting plugins在网站生成过程中执行。

  使用插件时需要先明确插件的目标是什么?在maven生命周期哪个阶段执行?dockerfile-maven-plugin插件的目标有build 、tag和push:

  • mvn dockerfile:build  通过dockerfile文件构建镜像(需要在docker服务器中执行)。
  • mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。
  • mvn dockerfile:push :推送镜像到docker镜像仓库(需要配置docker镜像仓库地址并登录)。

   插件目标和生命周期绑定是通过executions节点配置来完成的,举例如下:

            <!-- docker打包插件 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>${dockerfile-maven-plugin.version}</version>
                <configuration>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                    <repository>${docker.image.prefix}/qrcode-admin</repository>
                    <tag>1.1.5_xxx</tag>
                    <buildArgs>
                        <JAR_FILE>target/qrcode-admin.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
                <executions>                   <!-- 插件目标执行集合 -->
                    <execution>                <!-- 表示一个具体的插件目标执行 -->
                        <id>build</id>         <!-- 用于唯一标识一个执行 -->
                        <phase>install</phase> <!-- 指定插件目标应该何时执行,即绑定的生命周期阶段,compile、test、package等 -->
                        <goals>                <!-- 指定要执行的插件目标集合 -->
                            <goal>build</goal> <!-- 指定要执行的插件目标名称 -->
                        </goals>
                        <configuration>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

  配置完成后执行maven生命周期方法时该插件目标便会自动运行,如图:

七、运行mvn dockerfile命令

  • mvn  clean  install  package:项目的清理、安装、打包命令。
  • mvn dockerfile:build:通过dockerfile文件构建镜像。
  • mvn dockerfile:push:推送镜像到仓库。
  • mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。