浅谈使用Maven插件构建Docker镜像的方法

本文介绍了使用Maven插件构建Docker镜像的方法,分享给大家,具体如下:

工具

工欲善其事,必先利其器。笔者经过调研,有以下几款Docker的Maven插件进入笔者视野:

插件名称 官方地址
docker-maven-plugin https://github.com/spotify/docker-maven-plugin
docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin

笔者从Stars、文档易用性以及更新频率三个纬度考虑,选用了第一款。

使用插件构建Docker镜像

简单使用

我们以之前的项目:microservice-discovery-eureka为例:

在pom.xml中添加下面这段

 <build>
  <plugins>
   <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
   <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.12</version>
    <configuration>
     <!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
     <!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository name ... only [a-z0-9-_.] are allowed-->
     <imageName>microservice-discovery-eureka</imageName>
     <baseImage>java</baseImage>
     <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
     <resources>
      <resource>
       <targetPath>/</targetPath>
       <directory>${project.build.directory}</directory>
       <include>${project.build.finalName}.jar</include>
      </resource>
     </resources>
    </configuration>
   </plugin>
  </plugins>
 </build>

执行命令:

mvn clean package docker:build

我们会发现控制台有类似如下内容:

[INFO] Building image microservice-discovery-eureka
Step 1 : FROM java
Pulling from library/java
Digest: sha256:581a4afcbbedd8fdf194d597cb5106c1f91463024fb3a49a2d9f025165eb675f
Status: Downloaded newer image for java:latest
 ---> ea40c858f006
Step 2 : ADD /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar //
 ---> d1c174083bca
Removing intermediate container 91913d847c20
Step 3 : ENTRYPOINT java -jar /microservice-discovery-eureka-0.0.1-SNAPSHOT.jar
 ---> Running in 0f2aeccdfd46
 ---> d57b027ca65a
Removing intermediate container 0f2aeccdfd46
Successfully built d57b027ca65a
[INFO] Built microservice-discovery-eureka
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:38 min
[INFO] Finished at: 2016-09-18T01:05:05-07:00
[INFO] Final Memory: 40M/198M

恭喜,构建成功了。

我们执行docker images 会发现该镜像已经被构建成功:

REPOSITORY      TAG     IMAGE ID   CREATED    SIZE
microservice-discovery-eureka latest    d57b027ca65a  About a minute ago 681.5 MB

启动镜像

docker run -p 8761:8761 microservice-discovery-eureka

我们会发现该Docker镜像会很快地启动。

访问测试

访问http://Docker宿主机IP:8761 ,能够正常看到Eureka界面。

使用Dockerfile进行构建

上文讲述的方式是最简单的方式,很多时候,我们还是要借助Dockerfile进行构建的,首先我们在/microservice-discovery-eureka/src/main/docker目录下,建立文件Dockerfile

FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

修改pom.xml

<build>
  <plugins>
   <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
   <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.12</version>
    <configuration>
     <!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
     <!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository name ... only [a-z0-9-_.] are allowed-->
     <imageName>microservice-discovery-eureka-dockerfile</imageName>
     <!-- 指定Dockerfile所在的路径 -->
     <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
     <resources>
      <resource>
       <targetPath>/</targetPath>
       <directory>${project.build.directory}</directory>
       <include>${project.build.finalName}.jar</include>
      </resource>
     </resources>
    </configuration>
   </plugin>
  </plugins>
 </build>

其他步骤一样。这样即可使用Dockerfile进行构建Docker镜像啦。

将Docker镜像push到DockerHub上

首先修改Maven的全局配置文件settings.xml,添加以下段落

<servers>
 <server>
 <id>docker-hub</id>
 <username>你的DockerHub用户名</username>
 <password>你的DockerHub密码</password>
 <configuration>
  <email>你的DockerHub邮箱</email>
 </configuration>
 </server>
</servers>

在DockerHub上创建repo

项目pom.xml修改为如下:注意imageName的路径要和repo的路径一致

<build>
  <plugins>
   <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
   <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.12</version>
    <configuration>
     <!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
     <!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository
      name ... only [a-z0-9-_.] are allowed -->
     <!-- 如果要将docker镜像push到DockerHub上去的话,这边的路径要和repo路径一致 -->
     <imageName>eacdy/test</imageName>
     <!-- 指定Dockerfile所在的路径 -->
     <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
     <resources>
      <resource>
       <targetPath>/</targetPath>
       <directory>${project.build.directory}</directory>
       <include>${project.build.finalName}.jar</include>
      </resource>
     </resources>
     <!-- 以下两行是为了docker push到DockerHub使用的。 -->
     <serverId>docker-hub</serverId>
     <registryUrl>https://index.docker.io/v1/</registryUrl>
    </configuration>
   </plugin>
  </plugins>
 </build>

执行命令:

mvn clean package docker:build -DpushImage

搞定,等构建成功后,我们会发现Docker镜像已经被push到DockerHub上了。

将镜像push到私有仓库

在很多场景下,我们需要将镜像push到私有仓库中去,这边为了讲解的全面性,私有仓库采用的是配置登录认证的私有仓库。

和push镜像到DockerHub中一样,我们首先需要修改Maven的全局配置文件settings.xml,添加以下段落

<servers>
 <server>
 <id>docker-registry</id>
 <username>你的DockerHub用户名</username>
 <password>你的DockerHub密码</password>
 <configuration>
  <email>你的DockerHub邮箱</email>
 </configuration>
 </server>
</servers>

将项目的pom.xml改成如下,

<plugin>
 <groupId>com.spotify</groupId>
 <artifactId>docker-maven-plugin</artifactId>
 <version>0.4.12</version>
 <configuration>
 <!-- 路径为:私有仓库地址/你想要的镜像路径 -->
 <imageName>reg.itmuch.com/test-pull-registry</imageName>
 <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>

 <resources>
  <resource>
  <targetPath>/</targetPath>
  <directory>${project.build.directory}</directory>
  <include>${project.build.finalName}.jar</include>
  </resource>
 </resources>

 <!-- 与maven配置文件settings.xml一致 -->
 <serverId>docker-registry</serverId>
 </configuration>
</plugin>

执行:

mvn clean package docker:build -DpushImage

稍等片刻,将会push成功。

如果想要从私服上下载该镜像,执行:

docker login reg.itmuch.com # 然后输入账号和密码
docker pull reg.itmuch.com/test-pull-registry

将插件绑定在某个phase执行

在很多场景下,我们有这样的需求,例如执行mvn clean package 时,自动地为我们构建docker镜像,可以吗?答案是肯定的。我们只需要将插件的goal 绑定在某个phase即可。

所谓的phase和goal,可以这样理解:maven命令格式是:mvn phase:goal ,例如mvn package docker:build 那么,package 和 docker 都是phase,build 则是goal 。

下面是示例:

首先配置属性:

<properties>
<docker.image.prefix>reg.itmuch.com</docker.image.prefix>
</properties>

插件配置:

 <build>
 <plugins>
  <plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <executions>
   <execution>
   <id>build-image</id>
   <phase>package</phase>
   <goals>
    <goal>build</goal>
   </goals>
   </execution>
  </executions>
  <configuration>
   <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
   <baseImage>java</baseImage>
   <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
   <resources>
   <resource>
    <targetPath>/</targetPath>
    <directory>${project.build.directory}</directory>
    <include>${project.build.finalName}.jar</include>
   </resource>
   </resources>
  </configuration>
  </plugin>
 </plugins>
 </build>

如上,我们只需要添加:

  <executions>
   <execution>
   <id>build-image</id>
   <phase>package</phase>
   <goals>
    <goal>build</goal>
   </goals>
   </execution>
  </executions>

即可。本例指的是讲docker的build目标,绑定在package这个phase上。也就是说,用户只需要执行mvn package ,就自动执行了mvn docker:build 。

常见异常

连接不上2375(一般在Win7上出现)

代码如下:

Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]

解决步骤:

输入docker-machine env

$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.99.100:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\Administrator\.docker\machine\machines\default

为插件添加配置

<!-- 解决Connect to localhost:2375的问题的其中一种方式,注意要跟docker-machine env相一致 -->
<dockerHost>https://192.168.99.100:2376</dockerHost>    <dockerCertPath>C:\Users\Administrator\.docker\machine\machines\default</dockerCertPath>

修改后插件配置变为:

<plugin>
 <groupId>com.spotify</groupId>
 <artifactId>docker-maven-plugin</artifactId>
 <version>0.4.12</version>
 <configuration>
  <imageName>eacdy/test</imageName>
  <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>

  <!-- 解决Connect to localhost:2375的问题的其中一种方式,注意要跟docker-machine env相一致 -->
  <dockerHost>https://192.168.99.100:2376</dockerHost>
  <dockerCertPath>C:\Users\Administrator\.docker\machine\machines\default</dockerCertPath>
  <resources>
   <resource>
    <targetPath>/</targetPath>
    <directory>${project.build.directory}</directory>
    <include>${project.build.finalName}.jar</include>
   </resource>
  </resources>
  <!-- 以下两行是为了docker push到DockerHub使用的。 -->
  <serverId>docker-hub</serverId>
  <registryUrl>https://index.docker.io/v1/</registryUrl>
 </configuration>
</plugin>

参考:https://github.com/spotify/docker-maven-plugin/issues/116

TIPS

  1. imageName必须符合正则[a-z0-9-_.],否则将会构建失败
  2. 插件默认使用localhost:2375去连接Docker,如果你的Docker端口不是2375,需要配置环境变量DOCKER_HOST=tcp://<host>:2375

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解docker国内镜像拉取和镜像加速registry-mirrors配置修改

    由于国内访问直接访问Docker hub网速比较慢,拉取镜像的时间就会比较长.一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取. 我比较常用的是网易的镜像中心和daocloud镜像市场. 网易镜像中心:https://c.163.com/hub#/m/home/ daocloud镜像市场:https://hub.daocloud.io/ 我们可以先查看下自己的镜像,使用命令: [root@localhost docker]# docker images [root@localhost

  • Docker push镜像失败解决方法

    Docker push镜像失败的问题. 以下是输入push自己的tomcat后出现了失败 [root@slave3 ~]# docker push lekkoliu/tomcat8:latest The push refers to a repository [docker.io/lekkoliu/tomcat8] cefee3f6c961: Preparing 82f021d9c2b9: Preparing 4f91f02b4e49: Preparing a4b3ce7e1d4a: Prepa

  • Docker中镜像构建文件Dockerfile与相关命令的详细介绍

    前言 使用docker build命令或使用Docker Hub的自动构建功能构建Docker镜像时,都需要一个Dockerfile文件.Dockerfile文件是一个由一系列构建指令组成的文本文件,docker build命令会根据这些构建指令完成Docker镜像的构建.本文将会介绍Dockerfile文件,及其中使用的构建指令. 1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在

  • 如何给Docker配置官方国内加速镜像

    在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛.为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有: 网易 . USTC . DaoCloud . 阿里云 . 现在 Docker 官方针对中国区推出了镜像加速服务.通过 Docker 官方镜像加速,国内用户能够以更快的下载速度和更强的稳定性访问最流行的 Docker 镜像. 如何使用官方镜像 Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问.目前该镜像库只包含流行的公

  • 简单谈谈Docker镜像的使用方法

    在上篇文章(在Docker中搭建Nginx服务器)中,我们已经介绍了如何快速地搭建一个实用的Nginx服务器.这次我们将围绕Docker镜像(Docker Image),介绍其使用方法.包括三部分: 从Docker Hub或者其他镜像源安装Docker镜像 从Image file安装Docker镜像 从Docker file制作Docker镜像 查找Docker镜像 安装Docker镜像的第一步,是查找你需要的Docker镜像列表,键入: docker search mysql 如果出现权限问题

  • 详解如何修改docker pull镜像源

    Docker Hub Mirror 为全球最大的Docker Registry(Docker Hub)提供在中国的镜像代理服务.Docker Hub Mirror会为中国的用户在国内的服务器上缓存诸多镜像 当用户的Docker设定了--registry-mirror参数后,用户的Docker下拉镜像时,首先去Docker Hub Mirror中查找镜像,若命中则说明该镜像已经在Docker Hub Mirror中缓存,用户直接从Docker Hub Mirror中下载:若没有命中,则说该镜像还没

  • Docker创建镜像两种方法详解

     Docker创建镜像             最近学习Docker 的知识,偶然在网上看到关于Docker 创建对象的两种方法很好,这里记录下,也许可以帮助到你. 我们都知道Docker中我们是基于镜像来运行的容器,那如何创建镜像呢?创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件.这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像. 下面分别简单介绍一下两种方法.      

  • Docker创建镜像、怎么修改、上传镜像等详细介绍

    Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 二.修改已有镜像 1.先使用下载的镜像启动容器. $ docker run -t -i training/sinatra /bin/bash root@0b2616b0e5a8:/# 注意:记住容器的 ID,稍后还会用到. 2.

  • Docker常用的清除容器镜像命令小结

    前言 Docker 是一个非常有趣的项目.它自己宣称可以减轻部署服务器的难度,当然我相信里面有炒作的成分.但是实际使用后,我觉得 Docker 的表现还是可圈可点的.这篇文章主要总结了Docker清除容器镜像常用的命令,下面来一起看看吧. 杀死所有running状态的容器 docker kill $(docker ps -q) 删除所有已经停止的容器 docker rm $(docker ps -a -q) 删除所有\'untagged/dangling\' ()状态的镜像 docker rmi

  • 浅谈使用Maven插件构建Docker镜像的方法

    本文介绍了使用Maven插件构建Docker镜像的方法,分享给大家,具体如下: 工具 工欲善其事,必先利其器.笔者经过调研,有以下几款Docker的Maven插件进入笔者视野: 插件名称 官方地址 docker-maven-plugin https://github.com/spotify/docker-maven-plugin docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin docker-maven-pl

  • Maven插件构建Docker镜像的实现步骤

    背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网状分布的,有很多服务需要维护和管理,对它进行部署和维护的时候则比较复杂. 下面从Dev的角度来看一下Ops的工作.从Dev提交代码,到完成集成测试的一系列步骤如下: 首先是开发人员把程序代码更新后上传到Git,然后其他的事情都将由Jenkins自动完成. 然后Git在接收到用户更新的代码后,会把消息

  • 通过Dockerfile构建Docker镜像的方法步骤

    Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. Dockerfile支持Shell类的行尾添加"\"的命令换行方式,以及行首"#"进行注释的格式. 使用Dockerfile构建Docker镜像时注意事项: (1).尽量选取满足需求但较小的基础系统镜像; (2).清理编译生成文件.安装包的缓存等临时文件; (3).安装各个软件时候要指定准确的版本号,并避免引入不

  • Docker使用 Maven 插件构建镜像的方法

    通过 Maven 的 Docker 插件可以构建 Docker 镜像 快速入门 在 pom.xml 中添加 Docker 插件 <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>

  • 如何基于Jenkins构建Docker镜像

    这篇文章主要介绍了基于Jenkins构建Docker镜像,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 1. SpringCloud项目结构 注意Dockerfile文件的位置,跟src和pom.xml同级,后面会用到这个文件,若不同级,后面选择

  • SpringBoot构建Docker镜像的3种方式

    本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2)使用 Google 的 jib-maven-plugin. (3)使用 dockerfle-maven-plugin. Spring Boot 应用 为了方便实践,需要一个 Spring Boot 项目. Demo 项目地址: https://github.com/davelms/medium-ar

  • Spring Boot 2.4 新特性之一键构建Docker镜像的过程详解

    背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中. spotify .fabric8 这里主要使用的主要是如下两种插件 spotify .fabric8 , - -配置通过 xml 定义出 Dockerfile 或者挂载外部 Dockerfile 通过调用

  • Jenkins打包微服务构建Docker镜像运行的实现

    目录 环境准备 开始 1.GitLab远程仓库创建微服务项目 2.IDEA代码推送到Gitlab 3.Jenkins创建流水线项目 4.参数化构建 5.拉取远程仓库的构建脚本 6.编写远程审查脚本sonar-project.properties 构建脚本 环境准备 1.Jenkins 2.GitLab 3.SonarQube 4.Harbor 5.Docker 6.Maven 7.JDK1.8 8.微服务项目 以上技术部分在我之前的文章中有写过 这里就不过多细化的演示,本文章主要是连贯性的将微服

  • Jenkins构建Docker镜像并推送至Harbor仓库的实现

    目录 Dockerfile文件 pom.xml Jenkins配置 ​ spring boot项目通过Jenkins集成构建Docker镜像推送到harbor仓库并启动容器然后拉取镜像到本地运行容器 Dockerfile文件 位置:存在根目录下,与src同级 FROM java:8 # 作者 MAINTAINER zhaoyc VOLUME /tmp #ARG JAR_FILE #将jar包添加到容器中并更名为app.jar ADD target/*.jar app.jar RUN bash -

  • 使用GoogleContainerTools容器化jib构建docker镜像

    目录 前言碎语 插件配置 配置详解 插件命令使用 集成插件生命周期 文末结语 前言碎语 今天分享一个在容器化过程中非常重要的一个工具,java应用docker镜像build工具jib,这个工具是谷歌团队研发开源的,特点是不依赖docker守护进程,直白点说就是本地环境不安装docker环境也可以打包docker镜像.不用依赖维护Dockerfile,而且基于java打包插件可以轻松嵌入到java本身的构建生命周期中(本文使用maven).可以说是java容器化构建利器. 插件配置 <plugin

随机推荐