zoukankan      html  css  js  c++  java
  • 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 自动 来完成。

  • 相关阅读:
    祖传屎山代码
    WebService原理及重要术语
    ML-For-Beginners
    Row Level Security行级数据安全,简称RLS。
    浅析 Dapr 里的云计算设计模式
    讲师征集| .NET Conf China 2021正式启动
    为什么 Dapr 如此令人兴奋
    Open Application Model(OAM)的 Kubernetes 标准实现 Crossplane 项目 成为 CNCF 孵化项目
    kubectl 的插件管理工具krew
    PrimeBlazor 组件以MIT 协议开源
  • 原文地址:https://www.cnblogs.com/bear129/p/13198633.html
Copyright © 2011-2022 走看看