当前位置:首页 > 后端 > spring boot > 正文内容

Maven一键部署Springboot到Docker仓库,为自动化做准备

anan4个月前 (07-07)spring boot136

1 前言

前面《Springboot整合MongoDB的Docker开发,其它应用也类似》讲解了如何做Docker开发、如何把Springboot应用打包成一个镜像,但它是手动的,本文将讲解如何通过maven一键打包部署。

2 两个maven插件搞定

可以使用maven插件实现一键部署,这两个插件还是同一个公司的产品,就是著名的音乐流服务平台Spotify

2.1 spotify/docker-maven-plugin

2.1.1 基础用法

该插件可以实现镜像打包和push到仓库,无Dockerfile和有Dockerfile两种方式都可以,建议使用Dockerfile,更灵活。在mavenpom.xml文件加入以下插件配置:

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.2.2</version>
  <configuration>
    <imageName>pkslow/springboot-mongo</imageName>
    <imageTags>
      <imageTag>${imageVersion}</imageTag>
      <imageTag>latest</imageTag>
    </imageTags>
    <!-- optionally overwrite tags every time image is built with docker:build -->
    <forceTags>true</forceTags>
    <dockerDirectory>${project.basedir}</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

  • imageName:这是镜像名称;

  • imageTags:标签,支持多标签,即同一个镜像文件多个标签;我指定了一个参数imageVersion,可以命令行传入,方便后续整合Jenkins

  • forceTags:是否覆盖原有标签;

  • dockerDirectory:Dockerfile文件所在的位置;而且该目录下的所有文件都会被复制到${project.build.directory}/docker。因为我的Dockerfile放在项目根目录,所以整个项目的文件都复制过去了,包括源代码等。不得不吐槽一下这个设计,这是在强迫大家换个位置放Dockerfile吗?

  • resources:用来添加dockerDirectory外的其它资源文件。

添加后,通过以下命令执行:

$ mvn clean package docker:build -DimageVersion=0.0.4

通过命令docker images查看成功,运行也正常。

通过下面命令可以push到registry

mvn clean package docker:build -DpushImage

mvn clean package docker:build -DpushImageTag

2.1.2 与maven生命周期绑定

可以通过添加executions配置实现与maven生命周期的绑定。

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>VERSION GOES HERE</version>
  <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>my-image:${project.version}</image>
        <newName>registry.example.com/my-image:${project.version}</newName>
      </configuration>
    </execution>
    <execution>
      <id>push-image</id>
      <phase>deploy</phase>
      <goals>
        <goal>push</goal>
      </goals>
      <configuration>
        <imageName>registry.example.com/my-image:${project.version}</imageName>
      </configuration>
    </execution>        
  </executions>
</plugin>

有了这些绑定配置后,要打包镜像,直接mvn clean package即可。

2.1.3 仓库登陆信息配置

首先,插件可以使用配置在本地 ~/.dockercfg~/.docker/config.json的验证信息,或者可以显式地配置在maven上。

如配置在settings.xml文件:

<servers>
  <server>
    <id>docker-hub</id>
    <username>foo</username>
    <password>secret-password</password>
    <configuration>
      <email>foo@foo.bar</email>
    </configuration>
  </server>
</servers>

密码是可以加密的,详情请查看: Maven's built in encryption function

在项目的pom.xml中使用:

<plugins>
  <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>VERSION GOES HERE</version>
    <configuration>
      [...]
      <serverId>docker-hub</serverId>
      <registryUrl>https://index.docker.io/v1/</registryUrl>
    </configuration>
  </plugin>
</plugins>

2.2 spotify/dockerfile-maven

2.2.1 更简洁的插件

因为docker-maven-plugin有一些Bugs,所以Spotify开发了更方便简洁的插件dockerfile-maven

dockerfile-maven-plugin的配置更简单:

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>dockerfile-maven-plugin</artifactId>
  <version>${dockerfile-maven-version}</version>
  <executions>
    <execution>
      <id>default</id>
      <goals>
        <goal>build</goal>
        <goal>push</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <repository>spotify/foobar</repository>
    <tag>${project.version}</tag>
    <buildArgs>
      <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
    </buildArgs>
  </configuration>
</plugin>

配置好后,执行以下maven命令即可打包成镜像并推送到仓库:

mvn deploy

2.2.2 仓库验证

账号可以配置在pom.xml中,如下:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${version}</version>
    <configuration>
        <username>repoUserName</username>
        <password>repoPassword</password>
        <repository>${docker.image.prefix}/${project.artifactId}</repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

当然,也可以配置在maven的配置文件settings.xml中,这样更安全,请参考:https://github.com/spotify/dockerfile-maven/blob/master/docs/authentication.md

3 总结

通过maven插件,可以快速方便地一键打包、部署,非常方便,对后续的整个DevOps整合也是很有益的。

参考资料:

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

dockerfile-maven:https://github.com/spotify/dockerfile-maven

欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

欢迎大家关注、分享。

打赏
版权声明:所有来源为第三方内容,若本站收录的文章无意侵犯了贵司版权,请给下面邮箱地址来信,我们会及时处理和回复,谢谢。

管理员邮箱:42004990@qq.com

微信公众号

分享给朋友:

相关文章

如何运行Spring Boot项目

如何运行Spring Boot项目

背景帮别人指导一个Spring Boot项目,它在本地把项目push到git服务器上,然后在部署的服务器上把代码pull下来(我猜应该是这个流程)然后他问我这项目怎么运行?我当时就懵了,因为我平时都是...

Spring IoC 容器的扩展

Spring IoC 容器的扩展

前言本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本。因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析。本篇文章主要介绍 Spring IoC 容器的...

maven中引入多个仓库

maven中引入多个仓库

maven中的中央仓库是阿里云的,现在还需要引入有赞云的仓库;maven中的配置信息:<?xml version="1.0" encoding="...

如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

前言当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图:先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背?究其原因在于,你没有...

使用Actuator监控

使用Actuator监控

Actuator可能大家非常熟悉,它是springboot提供对应用自身监控,以及对应用系统配置查看等功能。springboot使用actuator的方式非常简单,只需要在项目中加入依赖spring-...

Spring 学习笔记

Spring 学习笔记

简介Spring 概述Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control)控制反转 和 AOP(Aspect O...