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