Jenkins Volume問題研究

Jenkins Volume問題研究(備份轉移相關技術)

ZONGRU Li
7 min readNov 9, 2022

目前狀況,原本透過以下指令建立Jenkins Container可以正常運作

#最早先建立的Jenkins Container的指令:
sudo podman run -p 8080:8080 -p 50000:50000 -d -v jenkins_home:/var/jenkins_home docker.io/jenkins/jenkins:lts

執行上述指令後,rootpodman 會建立一個volume空間

這個volume名稱是"jenkins_home"

#可以透過以下方式檢視該volume(記得!這是podman管理的volume,同理docker應該一樣機制):
sudo podman volume ls
#查看詳細這個volume的實體目錄:
sudo podman volume inspect {上面指令查到的volume的名稱,這邊是jenkins_home}

然後我想做的是,是複製這個目錄到其他常見的工作目錄,例如/var

並改用mount方式來對應目錄

甚至改用非root(不用sudo)的方式來綁定jenkins container

實際上我透過rootcp整個目錄後

並將複製來的目錄改為一般使用者個權限後大概如下

#剛cp -R整個目錄還會是root的,所以過程有做改變目錄權限(uid 1000就是ec2-user):
sudo chown -R 1000:1000 {複製來的目錄}

然後看到很神奇的狀況:

#整理一下下圖會用的指令:
sudo podman ps
podman ps
#root用這個複製的目錄起容器(記得這個就不是podman管理的volume了):
sudo podman run -p 8080:8080 -p 50000:50000 -d -v /var/jenkins_home/_data:/var/jenkins_home:Z docker.io/jenkins/jenkins:lts
#記得上面還有selinux的:Z要加才能正常運作#確認有容器正常運作:
sudo podman ps
#實際進去裡面看看home目錄的所有者:
sudo podman exec -it 5b43933cdc1c bash
id
ls ~/ -l
#離開容器:
exit
#從外面看看被mount的目錄所有者還是ec2-user:
ll /var/jenkins_home/_data -l

現在暫時先把該容器關閉:

#stop上面root起的容器:
sudo podman stop {容器id}

這時候很神奇地

我如果改用目前一般user來針對相同複製的目錄來起jenkins容器

也就是當前EC2的登入帳號

(同樣host(容器外)ec2-user uid 1000的帳號,但容器內uid 1000jenkins)

#用non-root身分來對同一個目錄起容器:
podman run -p 8080:8080 -p 50000:50000 -d -v /var/jenkins_home/_data:/var/jenkins_home:Z docker.io/jenkins/jenkins:lts
#用non-root身分確認容器是否正常運作:
podman ps
#用non-root身分查看這個無法正常運作的容器的log:
podman logs {上面在跑podman run時候會告訴你容器的id}

其實有不少文章有提到dockervolume與我想做的"bind mounts"是有差的

相信podman這邊也是同理

LINK

如上面這篇也建議只用volume就好

這邊解釋一下,這個volume也就是docker/podman管理下的空間目錄

#也就是以下指令可以查到的目錄,而非像我複製的實體目錄:
podman volume ls
podman volume inspect {上面找到的名子}

這人建議沒有要成為Docker大神或Jenkins Container大師的,就簡單用就好:

這段真的滿中肯的

接著我嚐試想用正常的方式直接地備份"volume"

docker官方的指令語法方式會是透過額外的ubuntuContainer

去跟運行中的jenkins container共享目錄後去用ubuntutar工具

在容器內進行備份動作

但是會有權限問題,所以這個沒辦法用,過程如下:

#我在/var目錄下建立備份用目錄:
sudo mkdir jkba
#確認當前沒有任何容器運行:
sudo podman ps
#建立jenkins容器,這次多給容器名稱jk:
sudo podman run -p 8080:8080 -p 50000:50000 -d -v /var/jenkins_home/_data:/var/jenkins_home:Z --name jk docker.io/jenkins/jenkins:lts
#確認有運行:
sudo podman ps
#嚐試docker官方標準的備份volume方式:
sudo podman run --rm --volumes-from jk -v $(pwd)/jkba:/var/jenkins_home ubuntu tar cvf /var/jenkins_home/backup.tar /var/jenkins_home
#上面語法就是起另一個ubuntu容器共享jk的目錄,並使用ubuntu的tar工具打包
#但是會發生目錄權限不足,沒辦法tar的問題

所以真的目前還是只能直接備份實體目錄:

LINK
#另外上面這個jk若stop了,下次要起應該是(不用再帶-p -v綁port綁volume了,會自己綁):
sudo podman start jk
#可以透過以下指令來看看這類帶名子的容器的設定資料(當初綁了啥port):
sudo podman container inspect {容器名稱,這邊就jk}

還滿長的,往下滾會看到這段:

也有PORT的部分:

以上簡單研究

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet