当前位置:   article > 正文

Springboot集成com.spotify docker-maven-plugin_com.spotify:docker-maven

com.spotify:docker-maven

Springboot集成com.spotify docker-maven-plugin

当前CI/CD在很大程度上简化了项目的部署流程,奈何项目的GitLab Runner无法投入使用,只能手动构建镜像……因此选择在springboot中使用maven构建docker镜像,简化docker build -t docker push等相关操作;这里选择对代码无侵入的com.spotify docker-maven-plugin,实现docker镜像的构建和推送。

集成构建插件

可以选择:
1.使用Dockerfile
2.将Docker命令绑定到Maven阶段(主要介绍该方式)
因该插件需要连接到docker server,以客户端的形式与docker server交互,所以需要先开启docker的远程访问。
Centos8:

vi /lib/systemd/system/docker.service
# 修改ExecStart
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock
# 修改完成后reload配置文件
sudo systemctl daemon-reload
# 重启docker服务
sudo systemctl restart docker.service
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用Dockerfile

在pom.xml中添加:

<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>docker-maven-plugin</artifactId>
      <version>VERSION GOES HERE</version>
      <configuration>
        <imageName>yourImageName</imageName>
        <dockerDirectory>./</dockerDirectory>
        <!-- 复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中,Dockerfile中不能访问上级目录 -->
        <resources>
           <resource>
             <targetPath>/</targetPath>
             <directory>${project.build.directory}</directory>
             <include>${project.build.finalName}.jar</include>
           </resource>
        </resources>
      </configuration>
    </plugin>
    ...
  </plugins>
</build>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

执行构建命令

mvn clean package docker:build -DskipTests=true    -DdockerImageTags=v0.1.0
  • 1

这里只对使用Dockerfile的方式做简单介绍,详细的配置方式参考下文。

将Docker命令绑定到Maven阶段

pom.xml相关配置:

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.9</version>
                <configuration>
                    <!--关联harbor配置,推送镜像时可在maven的settings.xml中配置认证信息-->
                    <serverId>my-docker-registry</serverId>
                    <!--基础镜像-->
                    <baseImage>harbor.com/project/your-base-image-name</baseImage>
                    <!--build 时,指定 –pull=true 每次都重新拉取基础镜像-->
                    <pullOnBuild>true</pullOnBuild>
                    <maintainer>123@qq.com</maintainer>
                    <workdir>/usr/app</workdir>
                    <entryPoint>["java", "-Dfile.encoding=utf-8", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                    <!--镜像构建完成之后,会重新打tag-->
                    <imageName>harbor.com/project/your-image-name</imageName>
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!-- docker远程服务器地址 -->
                    <dockerHost>http://127.0.0.1:2375</dockerHost>
                    <!-- Dockerfile文件存放目录 -->
                    <!--<dockerDirectory>./</dockerDirectory>-->
                    <!--build 时,指定 –no-cache 不使用缓存-->
                    <noCache>true</noCache>
                    <!--build 时强制覆盖 tag,配合 imageTags 使用-->
                    <forceTags>true</forceTags>
                    <!--build 完成后 push 镜像-->
                    <!--<pushImage>true</pushImage>-->
                    <pushImageTag>true</pushImageTag>
                    <!--push 镜像失败,重试次数 默认5次-->
                    <retryPushCount>1</retryPushCount>
                    <!--push 镜像失败,重试时间 默认10s-->
                    <retryPushTimeout>3</retryPushTimeout>
                    <runs>
                        <runs>ls</runs>
                        <runs>chmod +x /usr/local/bin -R</runs>
                    </runs>
                    <squashRunCommands>true</squashRunCommands>
                    <exposes>8765</exposes>
                    <pushImageTag>true</pushImageTag>
                    <!-- 复制 jar 包到 docker 容器指定目录配置,也可以写到 Docokerfile 中,Dockerfile中不能访问上级目录 -->
                    <resources>
                        <resource>
                            <targetPath>/root/webapp</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                        <!--可任意添加include或者exclude-->
                        <resource>
                            <targetPath>/root/webapp</targetPath>
                            <directory>./</directory>
                            <include>directory/</include>
                            <include>123</include>
                            <include>456</include>
                            <include>789</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>
                    </execution>
                </executions>-->
            </plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

settings.xml配置:

<servers>
        <server>
            <id>my-docker-registry</id>
            <username>admin</username>
            <password>明文/密文(后面介绍密文的配置)</password>
            <configuration>
                <email>你的邮箱(貌似必填)</email>
            </configuration>
        </server>
    </servers>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

执行构建命令:

mvn clean package docker:build -DskipTests=true  --settings settings.xml  -DdockerImageTags=your-tag
  • 1

主要执行流程:package jar —> build images —> push images

maven配置密文

1.创建settings-security.xml文件

${user.home}/.m2/settings-security.xml
  • 1

其中内容如下:

mvn --encrypt-master-password 123456(你的密码)

<settingsSecurity>
  <master>{FRvmADFkJGwHKGlu1H1iQKLl6iqTf+wTUfWi7YuDits=}</master>
</settingsSecurity>
  • 1
  • 2
  • 3

settings.xml中的password的值:

mvn --encrypt-password 123456(你的密码)

{S2f9YsFCm7gHttj9rjhZ+GCV8FZbKi6hkxQLf+4qQzA=}
  • 1

部分源码分析

https://github.com/spotify/docker-maven-plugin/blob/master/src/main/java/com/spotify/docker/BuildMojo.java
runs:
在这里插入图片描述
可以看到所有的runs都合成一条了。

resources:
在这里插入图片描述
可以看到所有的文件都是单独copy的,这边会产生许多中间镜像。

参考:
https://github.com/spotify/docker-maven-plugin
https://github.com/spotify/docker-maven-plugin/blob/master/src/main/java/com/spotify/docker/BuildMojo.java
https://maven.apache.org/guides/mini/guide-encryption.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/866576
推荐阅读
相关标签
  

闽ICP备14008679号