2014-02-13 157 views
1

我的問題是:詹金斯與碼頭工人

docker run -d -p 8080:8080 asd/jenkins # everything's ok 
# made changes at jenkins 
docker commit container_with_jenkins # comitted 
docker run -d -p 8080:8080 image_from_container_with_changes 
# => Error: create: No command specified 

我這麼想嗎?
如何處理碼頭的圖像並保存容器內的更改?

回答

2

當您提交圖像時,它不會從其父圖像繼承CMD。因此,當您基於新映像啓動容器時,需要提供運行命令。

docker run -d image_from_container_with_changes java -jar /var/lib/jenkins/jenkins.war 

其中運行命令當然取決於您的具體安裝。

Jenkins將其配置存儲在目錄中,例如, /root/.jenkins。我建議是在主機上創建一個目錄並把這個作爲一個卷:

docker run -v {absolute_path_to_jenkins_dir}:/root/.jenkins -d asd/jenkins 

如果以同樣的方式開始新的容器,它具有相同的工作等。如果你做出改變那些進入這個目錄(我不知道插件或更新的安裝位置),你仍然可能想要創建一個新的映像。在這種情況下,使用-run選項,當你提交你的容器來指定新的配置,

docker commit -run='{"Cmd": ["java", "-jar", "/var/lib/jenkins/jenkins.war"]}' abc1234d 
+0

'搬運工運行-d image_from_container_with_changes Java的罐子在/ var/lib中/詹金斯/ jenkins.war' - 很好地工作,基本上回答我的問題,謝謝。但是commit命令沒有做到預期的結果,看起來像'-run ='{「Cmd」:[「java」,「-jar」,「/var/lib/jenkins/jenkins.war」]}''忽略或不起作用。 Docker版本:0.8.0 – ted

+0

請查看http://docs.docker.io/en/latest/commandline/cli/#commit,這是解釋了-run的地方。此外,你可以檢查創建的圖像,看看Cmd確實沒有設置。也許0.8.0改變了一些東西 - 我在圖像上使用了相同的概念,使用0.7.x – qkrijger

+1

@ted我只注意到0.8.1中的一個修復,這可能解釋了您遇到的意外行爲:「修復 - 在docker commit中運行。使碼頭提交存儲 - 在圖像配置中運行「 – qkrijger