查看原文
其他

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

搜云库 搜云库技术团队 2019-04-07

一个用于构建和推送 Docker镜像的 Maven插件。

使用 Maven插件构建 Docker镜像,将 Docker镜像 push到 DockerHub上,或者私有仓库,上一篇文章是手写 Dockerfile,这篇文章借助开源插件 docker-maven-plugin 进行操作

以下操作。默认你已经阅读过我上一篇文章:

Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo

http://www.ymq.io/2018/01/11/Docker-deploy-spring-boot-Integrate-redis

最终效果

环境准备

  • 系统:Ubuntu 17.04 x64


  • Docker 17.12.0-ce

    Ubuntu 17.04 x64 安装 Docker CE


http://www.ymq.io/2018/01/11/Docker-Install-docker-ce/

插件地址

docker-maven-plugin

GitHub 地址:https://github.com/spotify/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. Step 1/3 : FROM java

  13. ---> d23bdf5b1b1b

  14. Step 2/3 : ADD /docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar //

  15. ---> b5d8f92756f2

  16. Step 3/3 : ENTRYPOINT ["java", "-jar", "/docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar"]

  17. ---> Running in 6867f460b40c

  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] Final Memory: 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   Up About 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.        <!-- docker的maven插件,官网: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. Step 1/6 : FROM java:8

  3. ---> d23bdf5b1b1b

  4. Step 2/6 : VOLUME /tmp

  5. ---> Using cache

  6. ---> cb237cc84527

  7. Step 3/6 : ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar

  8. ---> 7fb5e3363ed5

  9. Step 4/6 : RUN bash -c 'touch /app.jar'

  10. ---> Running in ab5d10dd64ad

  11. Removing intermediate container ab5d10dd64ad

  12. ---> 05d96fe59da4

  13. Step 5/6 : EXPOSE 9000

  14. ---> Running in d63e20122d8e

  15. Removing intermediate container d63e20122d8e

  16. ---> 55ba378141fd

  17. Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  18. ---> Running in 962d476363a3

  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] Final Memory: 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

http://www.ymq.io/2017/12/31/Docker-dockerHub/

GitHub :docker-spring-boot-demo-maven-plugin

https://github.com/souyunku/other-projects/tree/master/docker-spring-boot-demo-maven-plugin

Contact

  • 作者:鹏磊

  • 出处:http://www.ymq.io/2018/01/15/Docker-maven-plugin

  • Email:admin@souyunku.com

  • 版权归作者所有,转载请注明出处

  • Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存