首先我們需要在agent pod中完成編譯,構(gòu)建鏡像,推送鏡像,kubectl觸發(fā)更新。顯然我們需要把需要的工具打包成容器鏡像,基礎(chǔ)鏡像為了方便選擇了centos7的鏡像。
在構(gòu)建jenkins-agent 鏡像時(shí)卻遇到了幾個(gè)問(wèn)題。
鏡像中可以使用docker 嗎?
[root@4e1e6d1c770d /]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@4e1e6d1c770d /]# systemctl start docker
Failed to get D-Bus connection: Operation not permitted
在我嘗試啟動(dòng)docker服務(wù)的時(shí)候卻報(bào)錯(cuò)了
但是問(wèn)題來(lái)了:Failed to get D-Bus connection: Operation not permitted
這個(gè)問(wèn)題從字面意思是:無(wú)法獲取D總線連接:不允許操作
于是去網(wǎng)上查

那就給他權(quán)限執(zhí)行一下
[root@base4 ~]# docker exec -it f2386757dccef bash
[root@f2386757dcce /]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@f2386757dcce /]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
這時(shí)候我的心是崩潰的。后面詢問(wèn)大佬才知道,容器里不能虛擬容器了,這里違背常理的

那我就知道了
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools
jenkins/build-tools jenkins/build-tools:v3 jenkins/build-tools:v5 jenkins/build-tools:v7
jenkins/build-tools:v1 jenkins/build-tools:v4 jenkins/build-tools:v6
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools:v
v1 v3 v4 v5 v6 v7
[root@base4 ~]# docker run -itd -v /var/run/docker.sock:/var/run/docker.sock jenkins/build-tools:v1
ffbb25b7ab2941339b192aa36f406c35b790fc8c4ee48f97f989234909b17f7f
[root@base4 ~]# docker exec -it ffbb25b7ab29 bash
[root@ffbb25b7ab29 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ffbb25b7ab29 jenkins/build-tools:v1 "bash" 12 seconds ago Up 11 seconds quizzical_euclid
f2386757dcce jenkins/build-tools:v1 "init" 6 minutes ago Up 5 minutes nervous_herschel
ba1461878116 centos "init" 7 minutes ago Up 7 minutes eloquent_bassi
這樣問(wèn)題確實(shí)解決了,但新的問(wèn)題又出現(xiàn)了。
我們的k8s集群使用的時(shí)騰訊云的彈性集群,沒(méi)有docker.sock文件可以掛載呀,這怎么辦?
解決方案一
我在想docker有沒(méi)有api之類的,本機(jī)開(kāi)通api,讓其他機(jī)器調(diào)用
查看官網(wǎng)得知,docker確實(shí)是有Remote API,但是默認(rèn)沒(méi)有打開(kāi)
編輯vim /usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd 后增加-H=tcp://0.0.0.0:2375
增加后:

重啟服務(wù)
sudo systemctl daemon-reload
sudo service docker restart
檢查端口

如何使用:
docker -H 10.2.0.3:2375 ps
-H 指定docker 的地址
進(jìn)入容器測(cè)試:
docker -H 10.2.0.3:2375 ps
解決方案二
當(dāng)我把這個(gè)問(wèn)題告訴了我之前一起學(xué)習(xí)的同學(xué),他一下子就想到了解決方案。什么docker on docker ,docker in docker. 一些我沒(méi)聽(tīng)過(guò)的東西。最后他告訴我是有現(xiàn)成的開(kāi)源工具不需要依賴docker 守護(hù)鏡像就可以完成鏡像構(gòu)建的.在cicd這塊完全可以代替docker 完成 pull,push,build等操作。
工具如下
GitHub - genuinetools/img:獨(dú)立、無(wú)守護(hù)進(jìn)程、非特權(quán) Dockerfile 和 OCI 兼容容器映像生成器。
在Release這里可以下載到最新的包

可以通過(guò)介紹中的命令一鍵安裝到你的系統(tǒng)中

使用上完全兼容docker 的命令
拉取鏡像
./img-linux-amd64 pull nginx

修改tag
./img-linux-amd64 tag nginx:latest nginx:v1
