using maven plugins to push spring boot image into remote repository

      将spring boot在win10上打包后的jar, 上传到docker所在的vm, 再在docker中编写Dockerfile,  用docker build 命令生成镜像,

这是我最开始生成spring boot镜像的过程。但这很麻烦。今天搞个稍微自动化点的:通过maven插件,  主要是 dockerfile-maven-plugin, maven-deploy-plugin

直接在win 10上把spring boot的docker image上传到远程私有仓库。
 

0. 准备工作

   1. 远程私有仓库,  看 docker registry 2 with tls and basic authentication  

         远程私有仓库,是指docker上运行的一个registry:2的一个容器。这个远程仓库使用证书和用户名密码。

   2. 远程docker

      远程docker是指linux里运行的docker进程。不道我说明白没。   :)

       因为不想在windows 10上安装 docker toolbox, 所以就用了一个远程的docker(局域网), 这个要开启远程访问:

     改  /lib/systemd/system/docker.service

         ExecStart=/usr/bin/dockerd 后加 -H tcp://0.0.0.0:2395     端口随意,这里用2395,不用默认的2375.

         改完变这样:  ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2395 ...  省略号表示这一行后面的不动。

        然后要 # systemctl daemon-reload && systemctl restart docker,   (直接运行systemctl restart docker, 会提示让你 systemctl daemon-reload)

   (我的环境是远程私有仓库和远程docker用的是同一个vm, centos 7.x 环境)

1. 弄个spring boot项目:

   只有一个java文件:   ex.boot.Application.java, 这个文件要放到ex.boot包。

package ex.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

    public static void main(String... args) {
        SpringApplication.run(Application.class, args);
    }
    
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
Application.java

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ex.boot</groupId>
    <artifactId>spring-boot-remote-docker-registry</artifactId>
    <version>0.2</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
    </parent>

    <properties>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


    <build>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <mainClass>ex.boot.Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>    <!-- dockerfile-maven-plugin, 不是docker-maven-plugin, 后者已经不建议使用了。-->
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <username>tom</username>          <!-- 远程仓库的用户名, 不是远程docker -->
                    <password>12345678</password>     <!-- 密码  -->
                    <repository>node1.org/spring-boot-wlz/hello</repository>   <!-- 格式:  repository_name/image-name, 这里 image-name就是 spring-boot-wlz/hello -->
                    <tag>0.2</tag>
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>  <!-- 这一行用于Dockerfile, 这里暂时是没用的,因为我的Dockerfile里没有用于它,就放着吧 -->
                    </buildArgs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>      <!-- 没有这个插件 docker push 不会成功 -->
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>


        </plugins>
    </build>

    <distributionManagement>
        <repository>
            <id>private.repo</id>            <!-- 随意 -->
            <name>private repo</name>        <!-- 随意 -->
            <url>node1.org</url>             <!-- 远程仓库的域名,在win 10的hosts里要加上,位置在 C:WindowsSystem32driversetchosts -->
        </repository>
    </distributionManagement>


</project>
pom.xml

Dockerfile 位于project根目录,就是和pom.xml同一级目录

FROM java:8
ENTRYPOINT ["java", "-jar", "spring-boot-remote-docker-registry-0.2.jar"]
ADD target/spring-boot-remote-docker-registry-0.2.jar spring-boot-remote-docker-registry-0.2.jar

2. 几个注意的地方

    1. 要win 10的环境变量里加上 DOCKER_HOST=192.168.1.69:2395     这个是远程docker的IP和端口

        也可以在cmd中, 运行mvn deploy前, 设置一下: set DOCKER_HOST=192.168.1.69:2395.  但这个要每次打开cmd窗口,都要设置,cmd窗口一关,DOCKER_HOST的设置就不能再用了。

        相对来说,环境变量的方式一劳永逸。

    2. C:WindowsSystem32driversetchosts, 这个文件里加一行:

         192.168.1.69  node1.org

    3. pom.xml里要有私有仓库的配置

        <distributionManagement>
        <repository>
            <id>private.repo</id>
            <name>private repo</name>
            <url>node1.org</url>
        </repository>
      </distributionManagement>

3. 运行:  mvn deploy

    一行命令搞定,这样每个开发人员每次就这样发布一下就行了。然后,k8s再用私有仓库的 image 发布到集群里。

    或者开发人员只要提交代码, 上述过程由jenkins 自动 来完成。

原文地址:https://www.cnblogs.com/bear129/p/13198633.html