將Jenkins作爲集裝箱化服務運行並不是一件困難的事情。有許多圖像可以讓你做到這一點。我花了幾分鐘才讓Jenkins 2.0-beta-1運行在一個容器中,從源代碼編譯(圖像可以在here找到)。特殊性我喜歡這種方法,您只需確保使用數據卷或數據容器作爲jenkins_home
即可使數據保持不變。
當你想在容器中使用Jenkins來構建和管理容器本身時,事情會變得有點棘手。爲了實現這個目標,你需要實現一個名爲docker-in-docker的東西,因爲你需要一個docker守護進程和在Jenkins容器中可用的客戶端。
有一個非常好的教程解釋如何做到這一點:Docker in Docker with Jenkins and Supervisord。
基本上,你需要使用像supervisord這樣的東西來使兩個進程(Jenkins和Docker)在容器中運行。這是可行的,並宣稱擁有良好的隔離等等。但是可能非常棘手,因爲docker守護進程本身也有一些依賴關係,它們也需要存在於容器中。所以,只有使用supervisord並運行這兩個進程是不夠的,您需要利用DIND項目本身來使其工作......並且您需要以特權模式運行容器...並且您需要使用「我需要處理一些奇怪的DNS問題...
對於我個人的喜好,它聽起來太多的解決方法,使一些簡單的工作,並在一個容器內運行兩個服務似乎打破碼頭工人的良好做法和分離原則關注點,我想避免的事情。
當我讀到這個時,我的意見更加強烈:Using Docker-in-Docker for your CI or testing environment? Think twice。值得一提的是,這最後一篇文章來自DIND作者本人,所以他值得關注。
我的最終解決方案是:運行Jenkins作爲集裝箱化服務,是的,但考慮到docker守護進程作爲底層服務器供應的一部分,即使因爲您的docker緩存和映像是您可能想要保留的數據它們完全由守護進程擁有和控制。
採用這種設置,所有你需要做的是安裝在您的詹金斯圖像泊塢窗守護插座(這還需要泊塢窗客戶端,而不是服務):
$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v local/folder/with/jenkins_home:/var/jenkins_home namespace/my-jenkins-image
或者與碼頭工人,撰寫volumes
指令:
---
version: '2'
services:
jenkins:
image: namespace/my-jenkins-image
ports:
- '8080:8080'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- local/folder/with/jenkins_home:/var/jenkins_home
# other services ...
參見:http://stackoverflow.com/questions/36088227/how-to-run-a-docker-command-in-jenkins-build-execute-shell/ –
好吧,謝謝你。但是你知道使用jenkins作爲守護進程還是作爲容器哪種方法更好? –