介绍

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

使用

配置 DOCKER_HOST

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

DOCKER_HOST=unix:///var/run/docker.sock

构造镜像

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

  • 将构建信息指定到 POM 中
    支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中
  • 使用已存在的 Dockerfile 构建。
    上述不支持的必须使用Dockerfile

插件配置见附录

执行命令

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用户认证信息。

<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

<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