赞
踩
让docker在执行的时候执行entrypoint.sh,这是一个shell脚本,docker进程在执行这个shell脚本的话,会给脚本分配一个pid,这个pid是1,docker应该是维持一个pid等于1 的进程,一定在前台运行,生命周期在running状态
如果不用exec直接在shell脚本里写,java -jar,shell脚本就退出了,pid=1进程就退出了,切不到java进程,docker容器就退出了,docker容器就从running变成exited
这是shell脚本的知识,如果写了exec,就相当于exec后面的东西,代替了当前的shell脚本,从shell进程变成了pid等于1 的进程,java -jar启动的程序,dubbo程序变成了前台运行,且pid=1
不用exec,实际上相当于在entrypoint.sh弄了一个子进程,类似开了一个终端,执行了一个ps-a之类的,类似从init进程,fork出来的一个子进程。exec就是把当前的进程号给他了,到java进程手里了,这样就让写的最根本原因,为了让。docker容器生命周期,要保持在running状态而不会变成exec状态。这个是docker容器应用里比较常用的方式。nohup是后台,所以要exec
现在就是把base里底包做出来了,以后可以做若干底包
有maven软件,Dubbo服务的底包了, 现在可以配置流水线,流水线的方式去构造
需要保留多少次老的构建discard old builds,保留3天和30个
这个一个工程是参数化构建的,
需要加10个参数,第一个参数是string parameter,参数类型是string,名字是app_name,默认值default value,description描述/
trim the string,会自动把你填的空格删除
第二个参数类型是string,字符串类型的参数,名字是image_name,上面是docker提供者的一个项目,下面是一个镜像
第三个参数类型仍然是字符串,git版本控制仓库的地址,比如dubbo-demo-service的项目的地址,在gitee上
加不加.git其实无所谓
第四个也是字符串类型的参数。项目在git中央仓库所对应的,分支或者版本号,这个项目在git里有分支,master和apollo
要拉到本地就checkout 版本号。这样才能去编译出来指定的哪一版本代码,要制定就找commit id,是最标准的唯一的。git上的tag其实可以篡改的,所以commit id比较好
在graph上就可以看到每一次提交对应一个唯一的commit id,是不能被篡改的
可以checkout 分支,但是在构建的时候是分支上的最新代码,
第5个参数仍然是字符串,名字add_tag,给docker镜像增加标签,要拼一个git_ver作为标签拼进来,再加上一个时间戳
第6个参数,mvn_dir,在哪一个目录去执行对这个项目的编译操作,/就是在当前根目录
第7个参数仍然是string parameter,编译完成项目后,产生的jar包或者war包,所在的目录
第8个参数仍然是string类型,mvn_cmd执行编译所要的命令
第9个参数,是choice类型,base_image,可以选择之前做的base/jre7:7u80和base/jre8:8u12,这些就是项目使用的docker底包
第10个参数也是choice parameter,使用的maven软件版本
做流水线就需要10个参数,app_name,image_name,git_repo,git_ver,add_tag,mvn_dir,target_dir,_mvn_cmd,base_image,maven
还需要些pipeline-script
定义了一些stage步骤
实际上执行的是shell脚本
把项目clone到了这里
最后剪出分支
build,也是cd到工作目录,执行后面的/var/jenkins_home/maven-版本
也就是在这里
下来就是packages打包,用maven编译好项目,就需要去打包,把所有产生的jar包挪到指定文件夹里
下面要写dockerfile了
这个dockerfile是在jenkins流水线脚本自己写出来的
整体拼成以恶搞docker的tag,然后push到docker仓库
往这里贴
保留3天30份
10个参数
真正构建项目
构建可以点击这两个
流水线想要构架,需要填写10个参数,就会按照script进行构建
harbor里可以创建app私有仓库
拉取master分支的最新代码,时间戳就是19年12月1日_12点,编译地址是在项目根目录/,产生的目录是在dubbo-server/target,产生的jar包。
用的底包是base/jre8:8u12
开始第一次构建,这个10个参数也是为了避免甩锅
点进去
点击console output
第一次编译不成功很正常,因为要去国外的org拖jar包
常用的mvn命令,clean是把本地缓存清理掉。package 和install是对应要不要保存的问题,install就保存在本地,package是不保留在本地,-E只输出错误,-Q是静默的(就是在jenkins里根本看不到输出
用了流水线,就可以把200多个项目抽象成一条流水线,传不同的参数,现在dubbo服务交付提供的时候,交付dubbo服务的monitor,最后交付dubbo服务的消费者,然后dubbo服务这一套就交付到k8s里了
第一次构建比较慢,第二次就可以用本地缓存了,maven软件在/root/m2/repostry,很多jar包就不用去网上下载了
编译好后,可以推到harbor仓库里,对应的docker镜像应该是(镜像的4个组成部分,registry(harbor.od.com),repository(app),下的dubbo-demo-service:tag(master分支_191201_1200)
app仓库里会出现这么一个docker镜像
进入下个阶段,docker build。jenkins调用build的时候,使用的宿主机的docker引擎,
push完以后就完成了
发现变蓝了
docker镜像就来了
点进去可以看到tag
有了镜像,需要交付到k8s里,需要配置资源配置清单
去做资源配置清单。只需要一个dp.yaml
不需要svc。也不需要ingress
注意改时间戳,打这个tag是为了方便找出问题
要发到namespace里,app,把这个app namespace创建出来
紧跟着要在这个app里加入一个secret,把app名称空间和secret创建出来了
必须有这个,不然没法从private的仓库里拉镜像
label随便打。spec里有container,对应的镜像就是harbor.od.com/app/dubbo-demo-service:master_192101_1200.,ports是暴露出来的端口,是20880
env很重要,制作底包的时候,在entrypoint.sh要接收一个jar_ball环境变量,通过这个传到docker的环境变量里。
云原生的程序,配置一般通过三种方式,1.通过环境变量,2.通过启动参数,3.通过启动名称空间
image拉取策略有三种,always永远都去远程仓库拉,never永远不去远程仓库拉,ifnotpresent,如果没有再去远程仓库拉。
service account不配置,默认就是defaulte。run asuser指的是用root方式启动
在启动应用配置清单,先去配置zk
连接到zk里
根里只有zookeeper,没有dubbo
去应用dubbo服务提供者
查看是否很顺利的交付到k8s里,在app名称空间里
这个pod已经起来了
最后会提示dubbo服务已经启动
这样就在k8s里完美交付了一个dubbo服务的提供者,用jenkins去持续构建,把dubbo服务的提供者列出来,通过资源配置清单,交付到k8s里,去zk列出来list,dubbo服务的接口
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。