2015-07-13 165 views
14

我正在運行一個Jenkins集羣,其中主節點和從節點都在作爲Docker容器運行。Docker中的Docker無法安裝卷

主機是在MacOS上運行的最新的boot2docker VM。

爲了讓詹金斯能夠執行使用泊塢部署,我已經安裝在主機docker.sock和泊塢窗客戶端向詹金斯容器是這樣的: -

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v $HOST_JENKINS_DATA_DIRECTORY/jenkins_data:/var/jenkins_home -v $HOST_SSH_KEYS_DIRECTORY/.ssh/:/var/jenkins_home/.ssh/ -p 8080:8080 jenkins 

我面臨的問題,同時安裝向在Jenkins容器內運行的Docker容器添加一個卷。例如,如果我需要運行詹金斯容器內的另一個容器中,我執行以下操作: -

sudo docker run -v $JENKINS_CONTAINER/deploy.json:/root/deploy.json $CONTAINER_REPO/$CONTAINER_IMAGE 

上面運行的容器,但文件「deploy.json」未安裝的文件,但而是作爲「目錄」。即使我將目錄掛載爲卷,我也無法查看生成的容器中的文件。

這是一個問題,因爲在Docker案例中由於Docker的文件權限?

任何指針都會很有用!

謝謝!

回答

27

Docker容器中的Docker容器使用父HOST的Docker守護進程,因此,在「docker-in-docker」情況下掛載的任何卷仍從HOST引用,而不是從容器引用。

因此,從Jenkins容器安裝的實際路徑在HOST中「不存在」。由於這個原因,在空的「docker-in-docker」容器中創建了一個新的目錄。將目錄裝載到Container中的新Docker容器時,同樣適用。

非常基本和明顯的東西,我錯過了,但很快我意識到輸入問題就意識到了。

+0

謝謝。巨大的幫助。肯定沒有意識到它會表現得那樣。 –

+0

很高興知道這有幫助。謝謝! – ZephyrPLUSPLUS

+7

那麼解決方案是什麼?因爲docker文檔引用了https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/,它說這樣使用docker。但是這種方式無法將容器從一個碼頭容器掛載到另一個容器。數據量? –

2

另一種解決方法是使用命名卷或數據卷容器。這樣,容器內部不需要知道主機的任何信息,Jenkins容器和構建容器都以相同的方式引用數據量。

我試過做類似於你正在做的事情,除了代理人而不是使用Jenkins主人。問題相同,因爲我無法將Jenkins工作區安裝在內部容器中。對我來說有效的是使用數據容器容器方法,並且工作區文件對代理容器和內部容器均可見。我喜歡的方法是兩個容器都以相同的方式引用數據量。使用內部容器來安裝目錄會非常棘手,因爲內部容器現在需要知道其父容器正在運行的主機。

我有詳細的博客文章對我的做法在這裏:

http://damnhandy.com/2016/03/06/creating-containerized-build-environments-with-the-jenkins-pipeline-plugin-and-docker-well-almost/

除了代碼在這裏:

https://github.com/damnhandy/jenkins-pipeline-docker

在我的具體情況,而不是一切工作我的方式按照Jenkins Pipeline插件喜歡它。但它確實解決了內部容器能夠訪問Jenkins工作空間目錄的問題。

+0

我不能相信有人低估了這個答案。這是非常出色的,正確地處理問題的核心。這是一個解決方案,因爲它存在的原因使用Docker的功能。 – neverfox

+0

另一個相關的博客文章可以在這裏找到(https://www.develves.net/blogs/asd/2016-05-27-alternative-to-docker-in-docker/)(不是我的)。 – helmesjo

4

關於你的使用情況與詹金斯,你可以簡單地僞造通過創建主機上的符號鏈接的路徑:

ln -s $HOST_JENKINS_DATA_DIRECTORY/jenkins_data /var/jenkins_home 
+0

我解決了我的問題謝謝! –

0

一種方法來解決這個問題是在安裝目錄(你的搬運工容器內在其中您使用完全相同的路徑來安裝您的碼頭插座)。然後,當您從該容器內運行容器時,您可以使用docker -v將該容器的路徑內的任何內容安裝到新容器中。

藉此例如:

# Spin up your container from which you will use docker 
docker run -v /some/dir:/some/dir -v /var/run/docker.sock:/var/run.docker.sock docker:latest 

# Now spin up a container from within this container 
docker run -v /some/dir:/usr/src/app $CONTAINER_IMAGE 

文件夾/some/dir現在被安裝在您的主機上,中間容器以及您的目的地容器中。由於安裝路徑作爲「幾乎在碼頭中的泊塢窗」容器在主機上存在,因此可以按預期使用docker -v

這有點類似於在主機上創建一個符號鏈接的建議,但我發現這個(至少在我的情況下)是一個更乾淨的解決方案。之後不要忘記清理主機上的目錄! ;)