• 近期将进行后台系统升级,如有访问不畅,请稍后再试!
  • 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上

一个用于构建和推送 Docker镜像的 Maven插件。
使用 Maven插件构建 Docker镜像,将 Docker镜像 push到 DockerHub上,或者私有仓库,上一篇文章是手写 Dockerfile,这篇文章借助开源插件 docker-maven-plugin 进行操作
以下操作。默认你已经阅读过我上一篇文章:
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数 Demo

最终效果

环境准备

  • 系统:Ubuntu 17.04 x64

  • Docker 17.12.0-ce
    Ubuntu 17.04 x64 安装 Docker CE

插件地址

docker-maven-plugin

一、简单使用

1.修改 POM

在 pom.xml中添加下面这段,
  1. <build>
  2.    <plugins>
  3.        <plugin>
  4.            <groupId>org.springframework.boot</groupId>
  5.            <artifactId>spring-boot-maven-plugin</artifactId>
  6.        </plugin>
  7.        <!-- docker 的 maven 插件,官网:https://github.com/spotify/docker-maven-plugin -->
  8.        <plugin>
  9.            <groupId>com.spotify</groupId>
  10.            <artifactId>docker-maven-plugin</artifactId>
  11.            <version>0.4.12</version>
  12.            <configuration>
  13.                <!-- 注意 imageName 一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
  14.                <!-- 详见:https://github.com/spotify/docker-maven-plugin    Invalid repository name ... only [a-z0-9-_.] are allowed-->
  15.                <imageName>microservice-discovery-eureka</imageName>
  16.                <baseImage>java</baseImage>
  17.                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
  18.                <resources>
  19.                    <resource>
  20.                        <targetPath>/</targetPath>
  21.                        <directory>${project.build.directory}</directory>
  22.                        <include>${project.build.finalName}.jar</include>
  23.                    </resource>
  24.                </resources>
  25.            </configuration>
  26.        </plugin>
  27.    </plugins>
  28. </build>

2.构建镜像

使用 maven 命令: mvn cleanpackagedocker:build
  1. & cd /opt/other-projects/docker-spring-boot-demo-maven-plugin
  2. & mvn clean package docker:build
我们会发现控制台有类似如下内容:
  1. Results:
  2. Tests run:1,Failures:0,Errors:0,Skipped:0
  3. [INFO]
  4. [INFO]--- maven-jar-plugin:2.6:jar (default-jar)@ docker-spring-boot-demo-maven-plugin ---
  5. [INFO]Building jar:/opt/other-projects/docker-spring-boot-demo-maven-plugin/target/docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar
  6. [INFO]
  7. [INFO]--- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default)@ docker-spring-boot-demo-maven-plugin ---
  8. [INFO]
  9. [INFO]--- docker-maven-plugin:0.4.12:build (default-cli)@ docker-spring-boot-demo-maven-plugin ---
  10. [INFO]Copying/opt/other-projects/docker-spring-boot-demo-maven-plugin/target/docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar ->/opt/other-projects/docker-spring-boot-demo-maven-plugin/target/docker/docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar
  11. [INFO]Building image docker-spring-boot-demo-maven-plugin
  12. Step1/3: FROM java
  13. ---> d23bdf5b1b1b
  14. Step2/3: ADD /docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar //
  15. ---> b5d8f92756f2
  16. Step3/3: ENTRYPOINT ["java","-jar","/docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar"]
  17. --->Runningin6867f460b40c
  18. Removing intermediate container 6867f460b40c
  19. --->378fd82432e0
  20. ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
  21. Successfully built 378fd82432e0
  22. Successfully tagged docker-spring-boot-demo-maven-plugin:latest
  23. [INFO]Built docker-spring-boot-demo-maven-plugin
  24. [INFO]------------------------------------------------------------------------
  25. [INFO] BUILD SUCCESS
  26. [INFO]------------------------------------------------------------------------
  27. [INFO]Total time:20.568 s
  28. [INFO]Finished at:2018-01-15T09:21:39+00:00
  29. [INFO]FinalMemory:37M/89M
  30. [INFO]------------------------------------------------------------------------
  31. root@souyunku:/opt/other-projects/docker-spring-boot-demo-maven-plugin#
恭喜,构建成功了。
-我们执行 docker images 会发现该镜像已经被构建成功:
  1. & root@souyunku:# docker images docker-spring-boot-demo-maven-plugin
  2. REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
  3. docker-spring-boot-demo-maven-plugin   latest              378fd82432e0        3 minutes ago       659MB

3.启动镜像

  1. root@souyunku:# docker run --name MySpringBootMavenPlugin-d -p 8080:80 docker-spring-boot-demo-maven-plugin
  2. 84ebb2ebb8c002d3935e6e31c6d2aab05c32c075036368228e84f818d20ded4a

4.查看容器

  1. & root@souyunku:# docker container ps -a
  2. CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
  3. 84ebb2ebb8c0        docker-spring-boot-demo-maven-plugin   "java -jar /docker-s…"   About an hour ago   UpAbout an hour    0.0.0.0:8080->80/tcp     MySpringBootMavenPlugin

5.访问服务

浏览器输入:http://Docker 宿主机 IP:8080 能够正常看到界面,文章开头的最终效果页面。

二、使用 Dockerfile

1.新建 Dockerfile

使用 Dockerfile 进行构建 Docker 镜像
上文讲述的方式是最简单的方式,很多时候,我们还是要借助 Dockerfile进行构建的, 首先我们在 /docker-spring-boot-demo-maven-plugin/src/main/resources目录下,建立文件 Dockerfile
  1. FROM java:8
  2. VOLUME /tmp
  3. ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar
  4. RUN bash -c 'touch /app.jar'
  5. EXPOSE 9000
  6. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2.修改 POM

项目 pom.xml修改为如下: 指定 Dockerfile所在的路径
  1. <build>
  2.    <plugins>
  3.        <!-- dockermaven插件,官网:https://github.com/spotify/docker-maven-plugin -->
  4.        <plugin>
  5.            <groupId>com.spotify</groupId>
  6.            <artifactId>docker-maven-plugin</artifactId>
  7.            <version>0.4.12</version>
  8.            <configuration>
  9.                <!--注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功-->
  10.                <!--详见:https://github.com/spotify/docker-maven-plugin    Invalid repository name ... only [a-z0-9-_.] are allowed-->
  11.                <imageName>docker-spring-boot-demo-maven-plugin</imageName>
  12.                <!--指定Dockerfile所在的路径-->
  13.                <dockerDirectory>${basedir}/src/main/resources</dockerDirectory>
  14.                <resources>
  15.                    <resource>
  16.                        <targetPath>/</targetPath>
  17.                        <directory>${project.build.directory}</directory>
  18.                        <include>${project.build.finalName}.jar</include>
  19.                    </resource>
  20.                </resources>
  21.            </configuration>
  22.        </plugin>
  23.    </plugins>
  24. </build>

3.构建镜像

使用 maven 命令: mvn cleanpackagedocker:build
  1. & cd /opt/other-projects/docker-spring-boot-demo-maven-plugin
  2. & mvn clean package docker:build

4.启动镜像

  1. root@souyunku:# docker run --name MySpringBootMavenPlugin-d -p 8080:80 docker-spring-boot-demo-maven-plugin
  2. 84ebb2ebb8c002d3935e6e31c6d2aab05c32c075036368228e84f818d20ded4a
其他步骤和上面一样。这样即可使用 Dockerfile进行构建 Docker镜像啦。

5.访问服务

浏览器输入:http://Docker 宿主机 IP:8080 能够正常看到界面,文章开头的最终效果页面。

三、push 镜像

将 Docker镜像 push到 DockerHub

1.修改 Maven 配置

首先修改 Maven的全局配置文件 settings.xml
查看 settings.xml 所在位置
  1. root@souyunku:# find /-name settings.xml
  2. /etc/maven/settings.xml
添加以下段落
  1. vi /etc/maven/settings.xml
  1. <servers>
  2.    <server>
  3.        <id>docker-hub</id>
  4.        <username>DockerHub 的账号</username>
  5.        <password>DockerHub 的密码</password>
  6.        <configuration>
  7.            <email>admin@souyunku.com</email>
  8.        </configuration>
  9.    </server>
  10. </servers>

2.创建 Repository

注册个账号:https://hub.docker.com/
在 DockerHub上创建 CreateRepository ,例如: docker-spring-boot-demo-maven-plugin,如下图

3.修改 POM

项目 pom.xml修改为如下:注意 imageName的路径要和 repo 的路径一致
镜像名称
  1. <properties>
  2.    <docker.image.prefix>souyunku</docker.image.prefix>
  3. </properties>
将 Docker镜像 push到 DockerHub
  1. <!--3:将 Docker 镜像 push 到 DockerHub 上-->
  2. <!-- docker 的 maven 插件,官网:https://github.com/spotify/docker-maven-plugin -->
  3. <plugin>
  4.    <groupId>com.spotify</groupId>
  5.    <artifactId>docker-maven-plugin</artifactId>
  6.    <version>0.4.12</version>
  7.    <configuration>
  8.        <!-- 注意 imageName 一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
  9.        <!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository
  10.            name ... only [a-z0-9-_.] are allowed -->
  11.        <!-- 如果要将 docker 镜像 push 到 DockerHub 上去的话,这边的路径要和 repo 路径一致 -->
  12.        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
  13.        <!-- 指定 Dockerfile 所在的路径 -->
  14.        <dockerDirectory>${basedir}/src/main/resources</dockerDirectory>
  15.        <resources>
  16.            <resource>
  17.                <targetPath>/</targetPath>
  18.                <directory>${project.build.directory}</directory>
  19.                <include>${project.build.finalName}.jar</include>
  20.            </resource>
  21.        </resources>
  22.        <!-- 以下两行是为了 docker push 到 DockerHub 使用的。 -->
  23.        <serverId>docker-hub</serverId>
  24.        <registryUrl>https://index.docker.io/v1/</registryUrl>
  25.    </configuration>
  26. </plugin>
  1.    

4.构建镜像

使用 maven 命令: mvn cleanpackagedocker:build-DpushImage
  1. & cd /opt/other-projects/docker-spring-boot-demo-maven-plugin
  2. & mvn clean package docker:build  -DpushImage
看到类似这样的数据,就证明构建镜像没毛病
  1. [INFO]Building image souyunku/docker-spring-boot-demo-maven-plugin
  2. Step1/6: FROM java:8
  3. ---> d23bdf5b1b1b
  4. Step2/6: VOLUME /tmp
  5. --->Using cache
  6. ---> cb237cc84527
  7. Step3/6: ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar
  8. --->7fb5e3363ed5
  9. Step4/6: RUN bash -c 'touch /app.jar'
  10. --->Runningin ab5d10dd64ad
  11. Removing intermediate container ab5d10dd64ad
  12. --->05d96fe59da4
  13. Step5/6: EXPOSE 9000
  14. --->Runningin d63e20122d8e
  15. Removing intermediate container d63e20122d8e
  16. --->55ba378141fd
  17. Step6/6: ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  18. --->Runningin962d476363a3
  19. Removing intermediate container 962d476363a3
  20. --->654b596fe91f
  21. ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
  22. Successfully built 654b596fe91f
  23. Successfully tagged souyunku/docker-spring-boot-demo-maven-plugin:latest
  24. [INFO]Built souyunku/docker-spring-boot-demo-maven-plugin
  25. [INFO]Pushing souyunku/docker-spring-boot-demo-maven-plugin
  26. The push refers to repository [docker.io/souyunku/docker-spring-boot-demo-maven-plugin]
  27. 464800d90790:Pushed
  28. d52b146f9147:Pushed
  29. 35c20f26d188:Mounted from souyunku/docker-spring-boot-demo
  30. c3fe59dd9556:Mounted from souyunku/docker-spring-boot-demo
  31. 6ed1a81ba5b6:Mounted from souyunku/docker-spring-boot-demo
  32. a3483ce177ce:Mounted from souyunku/docker-spring-boot-demo
  33. ce6c8756685b:Mounted from souyunku/docker-spring-boot-demo
  34. 30339f20ced0:Mounted from souyunku/docker-spring-boot-demo
  35. 0eb22bfb707d:Mounted from souyunku/docker-spring-boot-demo
  36. a2ae92ffcd29:Mounted from souyunku/docker-spring-boot-demo
  37. latest: digest: sha256:8d78ced0034f38be8086c8f812817ec4c12b178470b4cea668046906c825c9ee size:2424
  38. null: null
  39. [INFO]------------------------------------------------------------------------
  40. [INFO] BUILD SUCCESS
  41. [INFO]------------------------------------------------------------------------
  42. [INFO]Total time:41.764 s
  43. [INFO]Finished at:2018-01-16T09:56:23+00:00
  44. [INFO]FinalMemory:36M/88M
  45. [INFO]------------------------------------------------------------------------
  46. root@souyunku:/opt/other-projects/docker-spring-boot-demo-maven-plugin#

5.查看镜像

  1. root@souyunku:# docker images souyunku/docker-spring-boot-demo-maven-plugin
  2. REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
  3. souyunku/docker-spring-boot-demo-maven-plugin   latest              654b596fe91f        27 minutes ago      674MB
  1. root@souyunku:# docker images souyunku/docker-spring-boot-demo-maven-plugin
  2. REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
  3. souyunku/docker-spring-boot-demo-maven-plugin   latest              654b596fe91f        27 minutes ago      674MB
DockerHub 查看镜像,看到已经上传成功

6.启动镜像

  1. root@souyunku:# docker run --name MySpringBootMavenPlugin-d -p 8080:80 docker-spring-boot-demo-maven-plugin
  2. 84ebb2ebb8c002d3935e6e31c6d2aab05c32c075036368228e84f818d20ded4a
其他步骤和上面一样。这样即可使用 Dockerfile进行构建 Docker镜像啦。

7.访问服务

浏览器输入:http://Docker 宿主机 IP:8080 能够正常看到界面,文章开头的最终效果页面。

四、绑定 phase 执行

将插件绑定在某个 phase 执行
在很多场景下,我们有这样的需求,例如执行 mvn cleanpackage 时,自动地为我们构建 docker 镜像,可以吗?答案是肯定的。我们只需要将插件的 goal 绑定在某个 phase即可。
所谓的 phase和 goal,可以这样理解: maven命令格式是: mvn phase:goal ,例如 mvnpackagedocker:build 那么, package 和 docker 都是 phasebuild 则是 goal 。

1.修改 POM

下面是示例:
首先配置属性:
  1. <properties>
  2.    <docker.image.prefix>souyunku</docker.image.prefix>
  3. </properties>
  1. <plugin>
  2.    <groupId>com.spotify</groupId>
  3.    <artifactId>docker-maven-plugin</artifactId>
  4.    <version>0.4.12</version>
  5.    <executions>
  6.        <execution>
  7.            <id>build-image</id>
  8.            <phase>package</phase>
  9.            <goals>
  10.                <goal>build</goal>
  11.            </goals>
  12.        </execution>
  13.    </executions>
  14.    <configuration>
  15.        <!-- 注意 imageName 一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
  16.        <!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository
  17.            name ... only [a-z0-9-_.] are allowed -->
  18.        <!-- 如果要将 docker 镜像 push 到 DockerHub 上去的话,这边的路径要和 repo 路径一致 -->
  19.        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
  20.        <!-- 指定 Dockerfile 所在的路径 -->
  21.        <dockerDirectory>${basedir}/src/main/resources</dockerDirectory>
  22.        <resources>
  23.            <resource>
  24.                <targetPath>/</targetPath>
  25.                <directory>${project.build.directory}</directory>
  26.                <include>${project.build.finalName}.jar</include>
  27.            </resource>
  28.        </resources>
  29.        <!-- 以下两行是为了 docker push 到 DockerHub 使用的。 -->
  30.        <serverId>docker-hub</serverId>
  31.        <registryUrl>https://index.docker.io/v1/</registryUrl>
  32.    </configuration>
  33. </plugin>
新加内容
  1. <executions>
  2.    <execution>
  3.        <id>build-image</id>
  4.        <phase>package</phase>
  5.        <goals>
  6.            <goal>build</goal>
  7.        </goals>
  8.    </execution>
  9. </executions>
本例指的是讲 docker 的 build目标,绑定在 package这个 phase上。 也就是说,用户只需要执行 mvnpackage,就自动执行了 mvn docker:build 。

2.构建镜像

使用 maven 命令: mvnpackage
  1. & cd /opt/other-projects/docker-spring-boot-demo-maven-plugin
  2. & mvn package

3.启动镜像

  1. root@souyunku:# docker run --name MySpringBootMavenPlugin-d -p 8080:80 docker-spring-boot-demo-maven-plugin
  2. 84ebb2ebb8c002d3935e6e31c6d2aab05c32c075036368228e84f818d20ded4a

4.访问服务

浏览器输入:http://Docker 宿主机 IP:8080 能够正常看到界面,文章开头的最终效果页面。

推荐阅读:Docker Hub 仓库使用,及搭建 Docker Registry
GitHub :docker-spring-boot-demo-maven-plugin


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:使用 Maven 插件构建 SpringBoot 项目,生成 Docker 镜像 push 到 DockerHub 上
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00