Jenkins Volume問題研究
目前狀況,原本透過以下指令建立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
執行上述指令後,root的podman 會建立一個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
實際上我透過root做cp整個目錄後
並將複製來的目錄改為一般使用者個權限後大概如下
#剛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 1000是jenkins)
#用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}
其實有不少文章有提到docker的volume與我想做的"bind mounts"是有差的
相信podman這邊也是同理
如上面這篇也建議只用volume就好
這邊解釋一下,這個volume也就是docker/podman管理下的空間目錄
#也就是以下指令可以查到的目錄,而非像我複製的實體目錄:
podman volume ls
podman volume inspect {上面找到的名子}
這人建議沒有要成為Docker大神或Jenkins Container大師的,就簡單用就好:
接著我嚐試想用正常的方式直接地備份"volume"
用docker官方的指令語法方式會是透過額外的ubuntu的Container
去跟運行中的jenkins container共享目錄後去用ubuntu的tar工具
在容器內進行備份動作
但是會有權限問題,所以這個沒辦法用,過程如下:
#我在/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的問題
所以真的目前還是只能直接備份實體目錄:
#另外上面這個jk若stop了,下次要起應該是(不用再帶-p -v綁port綁volume了,會自己綁):
sudo podman start jk
#可以透過以下指令來看看這類帶名子的容器的設定資料(當初綁了啥port):
sudo podman container inspect {容器名稱,這邊就jk}
還滿長的,往下滾會看到這段:
也有PORT的部分:
以上簡單研究