Maven 插件之 docker-maven-plugin 的使用

 

一、docker-maven-plugin 介绍java

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

二、环境、软件准备git

本次演示环境,我是在本机 Mac OX 上操做,如下是安装的软件及版本:github

  1. Docker:version 17.03.1-ce
  2. Maven:version 3.3.9
  3. Java: version 1.8.0_91
  4. docker-maven-plugin:1.0.0

注意:这里咱们要测试 Java Maven 项目用 docker-maven 插件打镜像,上传镜像等操做,因此须要先安装一下 Docker、Maven、Java,这里忽略安装过程。sql

三、Demo 示例docker

3.1 配置 DOCKER_HOSTapache

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

DOCKER_HOST=tcp://<host>:2375

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

3.2 示例构建镜像markdown

构建镜像可使用一下两种方式,第一种是将构建信息指定到 POM 中,第二种是使用已存在的 Dockerfile 构建。
第一种方式,支持将 FROMENTRYPOINTCMDMAINTAINER 以及 ADD 信息配置在 POM 中,不须要使用 Dockerfile 配置。可是若是使用 VOLUME 或其余 Dockerfile 中的命令的时候,须要使用第二种方式,建立一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径便可。

这里咱们以一个 Java Maven 项目 mavendemo 做为示例演示一下。

3.2.1 指定构建信息到 POM 中构建

<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <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> <!-- 这里是复制 jar 包到 docker 容器指定目录配置 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>

3.2.2 使用 Dockerfile 构建

pom.xml配置
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 指定 Dockerfile 路径--> <!-- 这里是复制 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 docker_maven docker_maven@email.com WORKDIR /ROOT CMD ["java", "-version"] ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]

以上两种方式执行docker:build效果是同样的,执行输出过程大体以下:

[INFO] --- docker-maven-plugin:1.0.0:build (default-cli) @ mavenDemo --- [INFO] Building image mavendemo Step 1/5 : FROM java  ---> d23bdf5b1b1b Step 2/5 : MAINTAINER docker_maven docker_maven@email.com  ---> Using cache  ---> 2faf180d4a50 Step 3/5 : WORKDIR /ROOT  ---> Using cache  ---> 862210f7956a Step 4/5 : ENTRYPOINT java -jar mavenDemo.jar  ---> Running in 96bbe83de6ec  ---> c29009c88993 Removing intermediate container 96bbe83de6ec Step 5/5 : CMD java -version  ---> Running in f69b8d2a75b1  ---> bc8d54014325 Removing intermediate container f69b8d2a75b1 Successfully built bc8d54014325

执行完成后,使用docker images查看生成的镜像:

REPOSITORY TAG IMAGE ID CREATED SIZE mavendemo latest 333b429536b2 38 minutes ago 643 MB

3.3 执行命令

mvn clean package docker:build 只执行 build 操做

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

mvn clean package docker:build -DpushImageTag 执行 build 并 push 指定 tag 的镜像
注意:这里必须指定至少一个 imageTag,它能够配置到 POM 中,也能够在命令行指定。命令行指定以下:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2,POM 文件中指定配置以下:

<build>
  <plugins>
    ... <plugin> <configuration> ... <imageTags> <imageTag>imageTag_1</imageTag> <imageTag>imageTag_2</imageTag> </imageTags> </configuration> </plugin> ... </plugins> </build>

3.4 绑定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>mavendemo</imageName> <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>mavendemo:latest</image> <newName>docker.io/wanyang3/mavendemo:${project.version}</newName> </configuration> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> <configuration> <imageName>docker.io/wanyang3/mavendemo:${project.version}</imageName> </configuration> </execution> </executions> </plugin> </plugins> </build>

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

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

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

3.5 使用私有 Docker 仓库地址

实际工做环境中,咱们须要 push 镜像到咱们私有 Docker 仓库中,使用d ocker-maven-plugin 插件咱们也是很容易实现,有几种方式实现:

1、修改 POM 文件 imageName 操做

... <configuration> <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName> ... </configuration> ...

2、修改 POM 文件中 newName 操做

... <configuration> <imageName>mavendemo</imageName> ... </configuration> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>mavendemo</image> <newName>registry.example.com/wanyang3/mavendemo:v1.0.0</newName> </configuration> </execution> ...

3.6 安全认证配置

当咱们 push 镜像到 Docker 仓库中时,不论是共有仍是私有,常常会须要安全认证,登陆完成以后才能够进行操做。固然,咱们能够经过命令行 docker login -u user_name -p password docker_registry_host 登陆,可是对于自动化流程来讲,就不是很方便了。使用 docker-maven-plugin 插件咱们能够很容易实现安全认证。

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

<servers> <server> <id>my-docker-registry</id> <username>wanyang3</username> <password>12345678</password> <configuration> <email>wanyang3@mail.com</email> </configuration> </server> </servers>

而后只须要在 pom.xml 中使用 server id 便可。

<plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName> ... <serverId>my-docker-registry</serverId> </configuration> </plugin> </plugins>

3.7 其余参数

docker-maven-plugin 插件还提供了不少很实用的配置,稍微列举几个参数吧。

参数 说明 默认值
<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:b50b604,前提是不配置 newName false

四、FAQ

一、执行 build images 时,报错状况一:

[INFO] Building image mavendemo
org.apache.http.impl.execchain.RetryExec execute I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: No such file or directory -> [Help 1]

这个是由于 Docker 服务没有启动形成的,启动 Docker 便可。

二、执行 build images 时,报错状况二:

ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: Request error: POST unix://localhost:80/build?t=mavenDemo: 500, body: {"message":"Error parsing reference: \"mavenDemo\" is not a valid repository/tag: repository name must be lowercase"}: HTTP 500 Internal Server Error -> [Help 1]

这个是由于镜像名字不正确,Docker 镜像名称需匹配[a-z0-9-_.]。

参考资料

 

 

原文地址:https://blog.csdn.net/aixiaoyang168/article/details/77453974

相关文章
相关标签/搜索