jib插件

作者: david161 | 来源:发表于2022-03-05 10:16 被阅读0次

    今天给大家介绍的是由Google出品的容器镜像构建类库--Jib, 通过Jib可以非常简单快速的为你的Java应用构建Docker 和 OCI 镜像, 无需深入学习docker, 无需编写Dockerfile, 以 Maven插件、Gradle插件和Java lib的形式提供。
    三种使用Jib的方法:

    1. Maven插件:jib-maven-plugin;
    2. Gradle插件:jib-gradle-plugin;
    3. Java库:Jib Core;
    Jib目标

    1)Fast- 快速部署您的更改。Jib将您的应用程序分成多个层,从类中分离依赖项。现在您不必等待Docker重建整个Java应用程序 - 只需部署更改的层即可。
    2)Reproducible- 使用相同内容重建容器图像始终生成相同的图像。不用担心再次触发不必要的更新。
    3)Daemonless- 减少CLI依赖性。从Maven或Gradle中构建Docker镜像,然后推送到您选择的任何注册中心。不再编写Dockerfiles并调用docker build / push。

    官网地址
    github官网地址 
    https://github.com/GoogleContainerTools/jib
    
    最新版本
    <dependency> 
        <groupId>com.google.cloud.tools</groupId> 
        <artifactId>jib-maven-plugin</artifactId> 
        <version>2.5.2</version> 
    </dependency>
    
    基础镜像
    docker pull openjdk:8-alpine3.9 
    
    重新打标签
    docker tag openjdk:8-alpine3.9 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9 
    
    登录harbor-155私服
    docker login 192.168.198.155:5000 
    username:admin 
    password:Harbor12345 
    
    上传镜像 
    docker push 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9 
    
    删除jenkinsagent-154镜像 '
    docker rmi -f 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9 openjdk:8- alpine3.9
    
    项目配置
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId> 
            </plugin> 
            <plugin> 
                <groupId>com.google.cloud.tools</groupId> 
                <artifactId>jib-maven-plugin</artifactId> 
                <version>2.5.2</version> 
                <configuration> 
                    <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字--> 
                    <from>
                        <!--使用harbor-155上的openjdk镜像--> 
                        <image>192.168.198.155:5000/lagouedu/openjdk:8- alpine3.9</image> 
                        <!--harbor-155服务器的登录信息--> 
                        <auth>
                            <username>admin</username>
                            <password>Harbor12345</password> 
                        </auth> 
                    </from> 
                    
                    <to>
                        <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当 前工程的version--> 
                        <image>192.168.198.155:5000/lagouedu/jenkinsdemo:${project.version}</image> 
                        <auth>
                            <username>admin</username> 
                            <password>Harbor12345</password> 
                        </auth> 
                    </to>
    
                    <container> 
                        <!--配置jvm虚拟机参数--> 
                        <jvmFlags> 
                            <jvmFlag>-Xms512m</jvmFlag> 
                        </jvmFlags> 
                        <!--配置使用的时区--> 
                        <environment> 
                            <TZ>Asia/Shanghai</TZ> 
                        </environment> 
                        <!--要暴露的端口--> 
                        <ports> 
                            <port>8080</port> 
                        </ports> 
                    </container> 
                    <!--可以进行HTTP--> 
                    <allowInsecureRegistries>true</allowInsecureRegistries> 
                </configuration> 
                <!--将jib与mvn构建的生命周期绑定 mvn package自动构造镜像--> 
                <!--打包及推送命令 mvn -DsendCredentialsOverHttp=true clean package--> 
                
                <executions> 
                    <execution> 
                        <phase>package</phase> 
                        <goals> 
                            <goal>build </goal> 
                        </goals>
                    </execution> 
                </executions> 
            </plugin> 
        </plugins>
    </build>                    
    
    container元素介绍
    container配置: 
    这个标签主要配置目标容器相关的内容,比如: 
    
    appRoot -> 放置应用程序的根目录,用于war包项目 
    args -> 程序额外的启动参数. 
    environment -> 用于容器的环境变量 
    format -> 构建OCI规范的镜像 
    jvmFlags -> JVM参数 
    mainClass -> 程序启动类 
    ports -> 容器开放端口 
    
    详细资料请参考官网地址: 
    https://github.com/GoogleContainerTools/jib/tree/master/jib-maven- plugin#container-object
    
    controller

    controller/JibDemoController

    @RestController 
    public class JibDemoController { 
        @GetMapping("/") 
        public String hello() { 
            return "docker jib-maven-plugin jenkins hello!!!"; 
        } 
    }
    

    构建镜像

    执行命令: 
    mvn clean package -Dmaven.test.skip=true jib:build 
    
    执行命令后报错,错误的原因是由于 from image 配置的基础镜像需要认证信息必须要增加 
    -DsendCredentialsOverHttp=true的参数。 
    
    再次执行命令: 
    mvn clean package -Dmaven.test.skip=true jib:build - DsendCredentialsOverHttp=true
    

    三种构建参数

    对于一个已在pom.xml中配置了jib插件的java工程来说,下面是个标准的构建命令
    mvn compile jib:dockerBuild
    注意上面的dockerBuild参数,该参数的意思是将镜像存入当前的镜像仓库,这样的参数一共有三种,列表说明。


    image.png

    镜像的时间问题

    在使用命令mvn compile jib:dockerBuild构建本地镜像时,会遇到创建时间不准的问题:如下所示,lagou/jenkins:1.0是刚刚使用jib插件构建的镜像,其生成时间(CREATED字段)显示的是50 years ago:

    在jenkinsagent-154服务器拉取镜像 
    docker pull 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0 
    
    查看镜像 
    docker images
    

    上面显示的镜像生成时间显然是不对的,改正此问题的方法是修改pom.xml,在jib插件的container节点内增加creationTime节点,内容是maven.build.timestamp的时间,如下所示:

    <container> 
        <!--创建时间--> 
        <creationTime>${maven.build.timestamp}</creationTime> 
    </container>
    

    修改保存后再次构建,此时新的镜像的创建时间已经正确

    删除jenkinsagent-154服务器上镜像 
    docker rmi -f 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0 
    
    在harbor-155服务器上删除镜像 
    
    在idea中再次构建镜像 
    mvn clean package -Dtest.skip=true jib:build -DsendCredentialsOverHttp=true 
    
    在jenkinsagent-154服务器拉取镜像 
    docker pull 192.168.198.155:5000/lagouedu/jenkinsdemo:1.0 
    
    查看镜像 
    docker images 
    
    运行容器 
    docker run -itd --name jenkinsdemo -p 8080:8080 
    192.168.198.155:5000/lagouedu/jenkinsdemo:1.0
    
    测试容器:
    http://192.168.198.154:8080/
    

    多次构建后,积累的无用镜像

    构建多次后,本地会遗留多个名为,tag也是的镜像。 这些都是上一次构建的结果,在经历了新一轮的构建后,其镜像名和tag被新镜像所有,所以自身只能显示名为,tag也是,清理这些镜像的命令是docker image prune,然后根据提示输入"y",镜像即可被清理:

    docker image prune 
    提示信息如下 
    WARNING! This will remove all dangling images. 
    Are you sure you want to continue? [y/N] y 
    Deleted Images:
    

    jenkins整合jib

    gitlab服务器
    1. gitlab-152服务器上创建jibdemo项目。
    2. 使用idea开发工具将jibdemo项目上传gitlab服务器。
    jenkins服务器
    1. jenkinsmaster-153创建pipeline-test04任务
    Jenkinsfile文件

    编写步骤

    1. 环境检测:检测jenkinsagent-154节点基础软件运行情况
    2. 拉取代码:从gitlab-152服务器拉取jildemo项目
    3. 编译构建:jenkinsagent-154执行maven命令;使用jib插件声明周期push镜像至harbor-155服务器4. 删除容器:删除jenkinsagent-154服务器jibdemo容器
    4. 删除镜像:删除jenkinsagent-154服务器jibdemo镜像
    5. 登录harbor:docker登录harbor-155服务器
    6. 拉取镜像:拉取jibdemo镜像
    7. 运行容器:运行jibdemo容器
      脚本骨架
    pipeline { 
        agent { 
            label 'jenkinsagent-154' 
        }
        stages { 
            stage('检测环境') { 
                steps { sh label: '', script: '''java -version
                mvn -v 
                git version 
                docker -v''' 
                } 
            }
            stage('拉取代码'){ 
                steps{echo 'gitlab拉取代码' 
                } 
            }
            stage('编译构建'){ 
                steps{echo '编译构建' 
                } 
            }
            stage('删除容器'){ 
                steps{echo '删除容器' 
                } 
            }
            stage('删除镜像'){ 
                steps{ 
                    echo '删除镜像' 
                } 
            }
            stage('登录harbor'){ 
                steps{ 
                    echo '登录harbor' 
                } 
            }
            stage('拉取镜像'){ 
                steps{ 
                    echo '拉取镜像' 
                } 
            }
            stage('运行容器'){
                steps{ 
                    echo '运行容器' 
                } 
            } 
        } 
    }
    
    测试pipeline任务

    立即构建

    拉取代码
        stage('拉取代码'){ 
            steps{
                echo 'gitlab拉取代码' 
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
                doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
                userRemoteConfigs: [[credentialsId: 'c8634952-4993-4455-b164-35427823144f', url: 
                'ssh://git@192.168.198.152:222/lagou/jibdemo.git']]]) 
        } 
    }
    
    编译构建
    stage('编译构建'){ 
        steps{
            echo '编译构建' 
            sh label: '', script: 'mvn clean package -Dmaven.test.skip=true 
            jib:build -DsendCredentialsOverHttp=true' 
        } 
    }
    
    删除容器
    stage('删除容器'){ 
        steps{
            sh label: '', script: '''echo \'检查容器是否存在\' 
            containerid=`docker ps -a | grep -w jibdemo | awk \'{print $1}\'` 
            if [ "$containerid" != "" ];then 
                echo ‘容器存在,停止容器’ 
                docker stop $containerid 
                echo ‘删除容器’ 
                docker rm $containerid 
            fi''' 
        } 
    }
    
    删除镜像
    stage('删除镜像'){ 
        steps{ 
            sh label: '', script: '''echo \'检查镜像是否存在\'
                imageid=`docker images | grep jibdemo | awk \'{print $3}\'`
                if [ "$imageid" != "" ];then 
                
                    echo \'删除镜像\' 
                    docker rmi -f $imageid 
                fi''' 
        } 
    }
    
    登录harbor
    stage('登录harbor'){ 
        steps{ 
            echo '登录harbor' 
            sh label: '', script: 'docker login -u admin -p Harbor12345 192.168.198.155:5000' 
        } 
    }
    
    拉取镜像
    stage('拉取镜像'){ 
        steps{ 
            echo '拉取镜像' 
            sh label: '', script: 'docker pull 192.168.198.155:5000/lagouedu/jibdemo:1.0' 
        }
    }
    
    运行容器
    stage('运行容器'){ 
        steps{ 
            echo '运行容器' 
            sh label: '', script: 'docker run -itd --name jibdemo -p 8080:8080 
            192.168.198.155:5000/lagouedu/jibdemo:1.0' 
        } 
    }
    
    完整Jenkinsfile文件
    pipeline { 
        agent { 
            label 'jenkinsagent-154' 
        }
        stages { 
            stage('检测环境') { 
                steps { 
                    sh label: '', script: '''java -version 
                    mvn -v 
                    git version 
                    docker -v''' 
                } 
            }
            stage('拉取代码'){ 
                steps{
                    echo 'gitlab拉取代码' 
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
                    doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], 
                    userRemoteConfigs: [[credentialsId: 'c8634952-4993-4455-b164-35427823144f', url: 
                    'ssh://git@192.168.198.152:222/lagou/jibdemo.git']]]) 
                } 
            }
            stage('编译构建'){ 
                steps{
                    echo '编译构建' 
                    sh label: '', script: 'mvn clean package -Dmaven.test.skip=true 
                    jib:build -DsendCredentialsOverHttp=true' 
                } 
            }
            stage('删除容器'){ 
                steps{
                    sh label: '', script: '''echo \'检查容器是否存在\' 
                    containerid=`docker ps -a | grep -w jibdemo | awk \'{print $1}\'` 
                    if [ "$containerid" != "" ];then 
                        echo ‘容器存在,停止容器’ 
                        docker stop $containerid 
                        echo ‘删除容器’ 
                        docker rm $containerid 
                    fi'''
                }
            }
            stage('删除镜像'){ 
                steps{ 
                    sh label: '', script: '''echo \'检查镜像是否存在\'
                        imageid=`docker images | grep jibdemo | awk \'{print $3}\'` 
                        if [ "$imageid" != "" ];then 
                            echo \'删除镜像\' 
                            docker rmi -f $imageid 
                        fi''' 
                } 
            }
            stage('登录harbor'){ 
                steps{ 
                    echo '登录harbor' 
                    sh label: '', script: 'docker login -u admin -p Harbor12345 192.168.198.155:5000' 
                } 
            }
            stage('拉取镜像'){ 
                steps{ 
                    echo '拉取镜像' 
                    sh label: '', script: 'docker pull 192.168.198.155:5000/lagouedu/jibdemo:1.0' 
                }
            }
            stage('运行容器'){ 
                steps{ 
                    echo '运行容器' 
                    sh label: '', script: 'docker run -itd --name jibdemo -p 8080:8080 192.168.198.155:5000/lagouedu/jibdemo:1.0' 
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:jib插件

          本文链接:https://www.haomeiwen.com/subject/snkmrrtx.html