Maven插件之docker-maven-plugin

介绍

在持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了实现在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。

使用

配置 DOCKER_HOST

docker-maven-plugin 插件需要设置 Docker 地址为。

sh 复制代码
DOCKER_HOST=unix:///var/run/docker.sock

构造镜像

构建镜像可以使用一下两种方式

  • 将构建信息指定到 POM 中

    支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中

  • 使用已存在的 Dockerfile 构建。

    上述不支持的必须使用Dockerfile

插件配置见附录

执行命令

sh 复制代码
mvn clean package docker:build #只执行 build 操作

mvn clean package docker:build -DpushImage   #执行 build 完成后 push 镜像

mvn clean package docker:build -DpushImageTag #执行 build 并 push 指定 tag 的镜像

mvn docker:build -DdockerImageTags=1.0.0-dev docker:push  #镜像指定tag

注意:这里必须指定至少一个 imageTag,它可以配置到 POM 中,也可以在命令行指定。

绑定Docker 命令到 Maven 各个阶段

我们可以绑定 Docker 命令到 Maven 各个阶段,我们可以把 Docker 分为 buildtagpush,然后分别绑定 Maven 的 packagedeploy 阶段,此时,我们只需要执行mvn deploy就可以完成整个 build、tag、push操作了,当我们执行mvn build就只完成 build、tag 操作。除此此外,当我们想跳过某些步骤或者只执行某个步骤时,不需要修改 POM 文件,只需要指定跳过 docker 某个步骤即可。比如当我们工程已经配置好了自动化模板了,但是这次我们只需要打镜像到本地自测,不想执行 push 阶段,那么此时执行要指定参数-DskipDockerPush就可跳过 push 操作了。

如果我们想跳过 docker 某个过程时,只需要:

  • -DskipDockerBuild 跳过 build 镜像
  • -DskipDockerTag 跳过 tag 镜像
  • -DskipDockerPush 跳过 push 镜像
  • -DskipDocker 跳过整个阶段

安全认证配置

当我们 push 镜像到 Docker 仓库中时,不管是共有还是私有,经常会需要安全认证,登录完成之后才可以进行操作。当然,我们可以通过命令行 docker login -u user_name -p password docker_registry_host 登录,但是对于自动化流程来说,就不是很方便了。使用 docker-maven-plugin 插件我们可以很容易实现安全认证。

首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry用户认证信息。

xml 复制代码
<servers>
  <server>
    <id>docker-registry</id>
    <username>user</username>
    <password>12345678</password>
    <configuration>
      <email>xxxx@xxxx</email>
    </configuration>
  </server>
</servers>

然后只需要在 pom.xml 中使用 server id 即可。

然后只需要在 pom.xml 中使用 server id 即可。

附录

pom

xml 复制代码
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${docker.image.prefix}/${project.name}:${project.version}-dev</imageName>
                <!-- dockerfile所在目录 -->
                <dockerDirectory>${basedir}/src/main/docker</dockerDirectory>
                 <dockerHost>${docker.host}</dockerHost>
                <!-- maven settings.xml 中配置的docker 仓库的 server  -->
                <serverId>docker-registry</serverId>
                
			   <!-- 以下是docker build 的命令 《《《《《 -->
                <baseImage>java</baseImage>
                <maintainer>docker_maven docker_maven@email.com</maintainer>
                <workdir>/ROOT</workdir>
                <cmd>["java", "-version"]</cmd>
                <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                 <!-- 》》》》》》  -->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
            <executions>
                <execution>
                    <id>build-image</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
                <execution>
                    <id>tag-image</id>
                    <phase>package</phase>
                    <goals>
                        <goal>tag</goal>
                    </goals>
                    <configuration>
                        <image>${docker.image.prefix}/${project.name}:${project.version}-dev</image>
                        <newName>${docker.image.prefix}/${project.name}:${project.version}-RELEASE</newName>
                    </configuration>
                </execution>
                <execution>
                    <id>push-image</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>push</goal>
                    </goals>
                    <configuration>
                        <imageName>${docker.image.prefix}/${project.name}:${project.version}-RELEASE</imageName>
                    </configuration>
                </execution>
            </executions>
        </plugin>

参数

docker-maven-plugin 插件还提供了很多很实用的配置:

参数 说明 默认值
true build 时强制覆盖 tag,配合 imageTags 使用 false
true build 时,指定 --no-cache 不使用缓存 false
true build 时,指定 --pull=true 每次都重新拉取基础镜像 false
true build 完成后 push 镜像 false
true build 完成后,push 指定 tag 的镜像,配合 imageTags 使用 false
5 push 镜像失败,重试次数 5
10 push 镜像失败,重试时间 10s
true build 时,指定 --rm=true 即 build 完成后删除中间容器 false
true build 时,使用最近的 git commit id 前7位作为tag,例如:image:b50b604 。前提是不配置 newName false

参考

https://github.com/spotify/docker-maven-plugin

相关推荐
❀͜͡傀儡师1 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community1 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao2 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
计算机毕设指导62 小时前
基于微信小程序的丽江市旅游分享系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·旅游
java_logo3 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer4 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟4 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝4 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手4 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
Knight_AL5 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab