Maven 插件 docker-maven-plugin 的使用配置

Maven 插件 docker-maven-plugin 的使用配置

1. docker-maven-plugin 介绍

在持续集成过程当中,项目工程通常使用 Maven 编译打包,后生成镜像,经过上传镜像,可以大大提升上线效率,同时可以快速动态扩容,快速回滚。docker-maven-plugin 插件能够帮助咱们在Maven工程中,经过简单的配置,自动生成镜像并推送到仓库中。java

2. 示例

2.1 配置 DOCKER_HOST

docker-maven-plugin 插件默认链接本地 Docker 地址为:localhost:2375,因此咱们须要先设置下环境变量。git

DOCKER_HOST=tcp://<host>:2375

注意:若是没有设置 DOCKER_HOST 环境变量,能够命令行显示指定 DOCKER_HOST 来执行,如我本机指定 DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:builddocker

2.2 构建镜像

构建镜像可使用一下两种方式,第一种是将构建信息指定到 POM 中,第二种是使用已存在的 Dockerfile 构建。shell

  • 第一种方式,支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不须要使用 Dockerfile 配置
  • 第二种方式,若是使用 VOLUME 或其余 Dockerfile 中的命令的时候,须要建立一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径便可。
2.2.1 指定构建信息到 pom.xml 中
<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}</imageName>
                <baseImage>alpine-3.8.0-docker-image:2.0</baseImage>
                <maintainer>author author@email.com</maintainer>
                <workdir>/ROOT</workdir>
                <cmd>["java", "-version"]</cmd>
                <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>
2.2.2 使用 Dockerfile 构建

pom.xml 文件配置json

<build>
    <plugins>
         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!-- 指定 Dockerfile 路径-->
                <dockerDirectory>${basedir}/docker</dockerDirectory> 
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置,也能够写到 Docokerfile 中 -->
                <resources>
                    <resource>
                        <targetPath>/ROOT</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

${basedir}/docker/Dockerfile 文件配置缓存

FROM java
MAINTAINER [author] [author@email.com]
WORKDIR /ROOT
CMD ["java", "-version"]
ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]

3. 绑定 Docker 命令到 Maven 各生命周期

绑定 Docker 命令到 Maven 各个阶段,能够把 Docker 分为 build、tag、push,而后分别绑定 Maven 的 package、deploy 等阶段,此时,咱们只须要执行 mvn deploy 就能够完成整个 build、tag、push 操做了,当咱们执行 mvn build 就只完成 build、tag 操做。此外当想跳过某些步骤或者只执行某个步骤时,不须要修改 POM 文件,只须要指定跳过 docker 某个步骤便可。好比当工程已经配置好了自动化模板了,可是此次咱们只须要打镜像到本地自测,不想执行 push 阶段,那么此时执行要指定参数 -DskipDockerPush 就可跳过 push 操做了。安全

<build>
    <plugins>
         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!-- 指定 Dockerfile 路径-->
                <dockerDirectory>${basedir}/docker</dockerDirectory> 
                <!-- 这里是复制 jar 包到 docker 容器指定目录配置,也能够写到 Docokerfile 中 -->
                <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>
                </execution>
                <execution>
                    <id>push-image</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>push</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

当咱们执行 mvn package 时,执行 build、tag 操做,当执行 mvn deploy 时,执行 build、tag、push 操做。若是想跳过 docker 某个过程时,只须要:maven

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

例:咱们想执行 package 时,跳过 tag 过程,那么就须要 mvn package -DskipDockerTagtcp

3.1 安全认证配置
  1. 在 Maven 的配置文件 setting.xml 中增长相关 server 配置,主要配置 Docker registry 用户认证信息。
<servers>
  <server>
    <id>docker-registry</id>
    <username>author-username</username>
    <password>author-password</password>
    <configuration>
      <email>author@mail.com</email>
    </configuration>
  </server>
</servers>
  1. 在 pom.xml 中使用 server id 配置。
<plugins>
  <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
      <imageName>${project.artifactId}:${project.version}</imageName>
      ...
      <serverId>docker-registry</serverId>
    </configuration>
  </plugin>
</plugins>
3.2 其余参数

docker-maven-plugin 插件还提供了不少很实用的配置参数ui

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

[注]: Docker 镜像名称需匹配[a-z0-9-_.] 。


docker 删除容器的时候出现的 bug 解决方案

vi /etc/docker/daemon.json 的参数
"live-restore":false

/usr/lib/systemd/system/docker.service
添加了参数 MountFlags=slave
相关文章
相关标签/搜索