在容器中運(yùn)行Jenkins络断,并啟動容器節(jié)點(diǎn)進(jìn)行構(gòu)建

運(yùn)行Jenkins有多種方法,有l(wèi)inux/windows安裝包项玛,有war包自行發(fā)布到Servlet容器(例如Tomcat)貌笨,最簡單干凈的就是在容器中運(yùn)行,運(yùn)行結(jié)束jenkins直接刪除容器襟沮,不留垃圾锥惋。本文記錄一次體驗(yàn):通過容器運(yùn)行Jenkins昌腰,并在其中啟動容器節(jié)點(diǎn)完成構(gòu)建步驟。其中一些踩坑經(jīng)歷膀跌,相信值得借鑒遭商。本文實(shí)驗(yàn)基于Ubuntu 16.04 LTS , Docker 17.06.0-ce捅伤,docker-compose 1.8

讓容器運(yùn)行起來

編寫docker-compose.yml劫流,內(nèi)容如下

version: '2'
services:
 web:
  image: 'jenkins:alpine'
  restart: unless-stopped
  environment:
    TZ: 'Asia/Shanghai'
  ports:
    - '8080:8080'
    - '50000:50000'
  volumes:
    - './jks_home:/var/jenkins_home'

sudo docker-compose up -d運(yùn)行,結(jié)果如下

image.png

sudo docker-compose logs查看啟動log丛忆,發(fā)現(xiàn)錯誤提示沒有權(quán)限寫祠汇,如下
image.png

原因是,在docker-compose.yml中熄诡,做了數(shù)據(jù)卷綁定- './jks_home:/var/jenkins_home'可很,我們用sudo運(yùn)行容器,運(yùn)行時(shí)會自動創(chuàng)建jks_home凰浮,因?yàn)槭莝udo我抠,所有者和組都是root,而jenkins容器內(nèi)部運(yùn)行用戶是jenkins(uid:1000,gid:1000,參考Jekins Alpine Dockfile定義),因此當(dāng)然沒有權(quán)限往jks_home里寫了导坟。
趕緊的sudo chown simon:simon jks_home/
image.png

繼續(xù)觀察log屿良,終于看到
image.png

為什么把jks_home的所有者和組改成simon:simon就可以了呢?上面我們提到j(luò)enkins容器內(nèi)的運(yùn)行用戶jenkins的uid和gid是1000惫周,而simon的uid和gid也是1000尘惧,因此容器運(yùn)行時(shí),從主機(jī)看就是以simon在運(yùn)行递递,容器不過就是主機(jī)的一個進(jìn)程而已與其他在主機(jī)啟動進(jìn)程并無區(qū)別喷橙,只是為了實(shí)現(xiàn)隔離(名稱和資源),運(yùn)行了很多服務(wù)進(jìn)程登舞,對在Docker空間運(yùn)行進(jìn)程實(shí)施控制贰逾,不是很多介紹文章簡單認(rèn)為是輕量級虛擬機(jī)。
ps -aux | grep jenkins

image.png

瀏覽器打開http://192.168.1.101:8080/

image.png

按照畫面提示找到密碼,因?yàn)槲覀兪侨萜鬟\(yùn)行菠秒,所以sudo docker-compose exec web cat /var/jenkins_home/secrets/initialAdminPassword
image.png

copy密碼疙剑,貼到瀏覽器里藐窄,繼續(xù)竟趾,后續(xù)按照畫面提示安裝插件(筆者按照suggested的安裝),創(chuàng)建用戶等步驟导而,就不一一貼畫面了禁灼。

最終管挟,創(chuàng)建了一個名為pydocker的pipeline project,如下圖

image.png

沒有其他配置弄捕,只是添加了測試啟動Docker Slave的pipeline script

pipeline{
    agent {
        docker {
            image 'ubuntu'
        }
    }
    
    stages {
        stage('Build') {
            steps {
                sh 'uname -a'
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

要運(yùn)行Docker命令僻孝,還需要在jenkins所在容器安裝docker客戶端导帝,否則構(gòu)建會出現(xiàn) docker: not found錯誤。另外docker客戶端與服務(wù)器通訊支持2種協(xié)議穿铆,tcp和unix domain socket您单,后者只限于服務(wù)器在本地的情況,客戶端和服務(wù)器通過共同訪問一個本地socket文件來通訊悴务,如docker用的socket文件默認(rèn)位置就是/var/run/docker.sock睹限。好了譬猫,接下來我們就利用docker的volume mount來直接利用主機(jī)上的docker客戶端和sock文件讯檐,示意圖如下

image.png

更新后的docker-compose.yml如下

version: '2'
services:
 web:
  image: 'jenkins:alpine'
  restart: unless-stopped
  environment:
    TZ: 'Asia/Shanghai'
  ports:
    - '8080:8080'
    - '50000:50000'
  volumes:
    - './jks_home:/var/jenkins_home'
    - '/var/run/docker.sock:/var/run/docker.sock'
    - '/usr/bin/docker:/usr/bin/docker'

這里又有一個坑,如果你是通過apt安裝的docker的話染服,依然提示 docker: not found錯誤,原因是apt安裝的docker采用的是動態(tài)鏈接編譯的别洪,還依賴其他的so文件,而你沒有mount到容器柳刮,所以找不到相應(yīng)文件挖垛,這里有討論。解決辦法是安裝靜態(tài)編譯的docker秉颗。

好了痢毒,接著重啟容器sudo docker-compose down && sudo docker-compose up -d,再次在jenkins畫面點(diǎn)擊立即構(gòu)建蚕甥,咦哪替,還是出錯

image.png

怎么回事呢,原來jenkins容器里的docker客戶端通信要訪問docker.sock文件卻沒有權(quán)限
image.png

當(dāng)前用戶是jenkins,不在ping組(gid:999)里菇怀,所有的坑都是因?yàn)閖enkins容器的運(yùn)行用戶時(shí)jenkins(uid:1000)造成的凭舶,而其他容器化應(yīng)用,基本都是以root運(yùn)行的爱沟。

因?yàn)閖enkins可以安裝插件帅霜,猜測作者是擔(dān)心插件不安全,所以用普通用戶吧

這篇文章做法是新生成容器鏡像呼伸,授予jenkins超級用戶權(quán)限身冀,不知道這同直接用root用戶運(yùn)行jenkins有何區(qū)別,反正都不安全括享,測試么搂根,粗糙的編寫下面的Dockerfile

FROM jenkins:alpine
USER root

生成鏡像sudo docker build --rm -t jks .
改用jks鏡像,docker-compose.yml如下

version: '2'
services:
 web:
  image: 'jks'
  restart: unless-stopped
  environment:
    TZ: 'Asia/Shanghai'
  ports:
    - '8080:8080'
    - '50000:50000'
  volumes:
    - './jks_home:/var/jenkins_home'
    - '/var/run/docker.sock:/var/run/docker.sock'
    - '/usr/bin/docker:/usr/bin/docker'

重啟jenkins容器sudo docker-compose down && sudo docker-compose up -d,再次在jenkins畫面點(diǎn)擊立即構(gòu)建奶浦,

image.png

image.png

Finished: SUCCESS兄墅,啊,終于跑起來了澳叉。

總結(jié)

用容器運(yùn)行jenkins隙咸,方便快捷沐悦,但是因?yàn)殓R像用戶是jenkins,造成了很多不便五督,但是精細(xì)化控制和易用性總是需要平衡的藏否,目前似乎還沒有優(yōu)雅方案在容器中運(yùn)行容器。另外充包,在Docker Cloud服務(wù)越來越流行背景之下副签,jenkins調(diào)用容器命令,把鏡像發(fā)布到docker cloud中運(yùn)行基矮,方便實(shí)現(xiàn)Continuous Delivery淆储。

參考
Running Docker in Jenkins (in Docker)
uid=1000. gid=1000. why 1000?
Continuous Delivery with Docker on Mesos in less than a minute

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市家浇,隨后出現(xiàn)的幾起案子本砰,更是在濱河造成了極大的恐慌,老刑警劉巖钢悲,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件点额,死亡現(xiàn)場離奇詭異,居然都是意外死亡莺琳,警方通過查閱死者的電腦和手機(jī)还棱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惭等,“玉大人珍手,你說我怎么就攤上這事」径校” “怎么了珠十?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凭豪。 經(jīng)常有香客問我焙蹭,道長,這世上最難降的妖魔是什么嫂伞? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任孔厉,我火速辦了婚禮,結(jié)果婚禮上帖努,老公的妹妹穿的比我還像新娘撰豺。我一直安慰自己,他們只是感情好拼余,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布污桦。 她就那樣靜靜地躺著,像睡著了一般匙监。 火紅的嫁衣襯著肌膚如雪凡橱。 梳的紋絲不亂的頭發(fā)上小作,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音稼钩,去河邊找鬼顾稀。 笑死,一個胖子當(dāng)著我的面吹牛坝撑,可吹牛的內(nèi)容都是我干的静秆。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼巡李,長吁一口氣:“原來是場噩夢啊……” “哼抚笔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起击儡,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塔沃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阳谍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡螃概,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年矫夯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吊洼。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡训貌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冒窍,到底是詐尸還是另有隱情递沪,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布综液,位于F島的核電站款慨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谬莹。R本人自食惡果不足惜檩奠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望附帽。 院中可真熱鬧埠戳,春花似錦、人聲如沸蕉扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喳钟。三九已至屁使,卻和暖如春欠啤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屋灌。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工洁段, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人共郭。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓祠丝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親除嘹。 傳聞我的和親對象是個殘疾皇子写半,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容