2014-09-24 50 views
5

我想利用碼頭圖像緩存/分層來節省帶寬,磁盤空間和花費的時間。使用提交更新碼頭圖像進行小改動

讓說:

  • 我已經安裝了一個web應用程序泊塢窗圖像並部署到幾個搬運工主機。
  • 泊塢窗圖像包含我的web應用程序的源代碼。
  • 我工作的代碼,現在有一個新版本的代碼。

我應該如何自動化的創建一個新的泊塢窗提交最後的圖像上面只包含修正錯誤?

我的目標是隻需要下載一個小錯誤修正差異即可獲取已下載以前映像的泊塢窗主機的新映像。

這是我目前的反射關於它的沙爹:

  • 我可能會結束使用docker commit以某種方式保存更新的形象。
  • 但是如何訪問圖像內容?
  • 即使如此,我將如何導入我的更改,而不會混淆原始碼頭圖像與各種工具(git和shell腳本),這些與服務web應用程序無關?
  • 我已經看過捲來與另一個docker分享代碼,它會照顧它的更新。但卷不承諾。

感謝您對如何實現這一目標的任何見解!

編輯:使用多個Dockerfile似乎另一種方式來做到這一點,thx http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/爲類似的問題。似乎我需要立即生成我的dockerfiles。

+0

你如何將你的代碼添加到圖像? – Behe 2014-09-24 12:45:10

+0

@Behe我不明白你的問題,因爲我已經說過這是我的問題的一部分。如果您的問題是關於在第一個地方添加代碼(在更新應用程序之前),那麼我想在自動構建中使用ADD,如http://dockerfile.github.io/#/python-runtime。 – vaab 2014-09-25 01:42:55

+0

如果您使用Dockerfile並將ADD命令放到最後,它應該打到緩存,直到添加更改的內容,然後爲新內容創建一個新層。這聽起來有幫助嗎? – Behe 2014-09-25 15:22:06

回答

2

以下是如何使用docker commit更新現有圖像的方法。

  1. 推出要修改與圖像的容器:

    docker run -t -i IMAGE /bin/bash 
    

    注意,你可能會想訪問某些主機文件/目錄導入容器 變化:

    docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash 
    

    然後用Ctrl-D或exit退出。

    如果您想在腳本中自動執行此操作,則需要獲取容器 id以供下一步操作。而你將要發出命令直接的 而不是調用的bash的交互式會話:

    container_id=$(docker run -d -v /host/location:/mnt/share IMAGE /bin/bash -c " 
         ## any bash code 
         rsync -av --delete --exclude .git /mnt/share /my/app/ 
         cd /my/app 
         ./autogen.sh 
        ") 
    
  2. 提交修改後的容器的文件系統作爲一個新的形象:

    docker commit CONTAINER_ID IMAGE_NAME 
    

    注意:你可以想使用與您第一次啓動 時使用的IMAGE_NAME相同的IMAGE_NAME。這將有效地更新您的圖像。

其他問題:

  • 以前的圖像進行任何修改,應儘量在最後的形象創造了新的層減少。規則可能取決於您是否使用BTRFS(塊級修改實際上在'圖層'中)或AUFS(文件級修改)。最好的做法是避免用相同的文件替換整個源文件(避免使用cp -agit checkout-index,贊成rsyncgit checkout)。

  • 您需要在虛擬機上安裝一些工具,以便進行更新(可能爲git,rsync ...)。但是,不要忘記,由於已安裝的主機卷,您還可以提供腳本(甚至是完整的工具)。

  • 創建的圖像不是正統的,並不來自Dockerfile。您應該可以定期從官方Dockerfile重建全新的圖像。或者至少嘗試通過讓所有圖像直接基於一個官方圖像來最小化分層。