2014-12-05 98 views
2

我正在部署一個nginx實例。 dockerfile以及nginx配置數據和Web應用程序都在我的git存儲庫中。對我來說,這似乎是有道理的,這是一個git倉庫:應用程序以及如何部署它。在Dockerfile我想說的(這是簡化了一點,但問題是,我不能)將git存儲庫添加到docker鏡像(工作流最佳實踐)

COPY web-app /serving 
COPY docker/site-conf /etc/nginx/sites-enabled/ 

在那裏我有這樣的目錄結構:

my-git-root 
    web-app 
     ... 
    docker 
     Dockerfile 
     build.sh 
     site-conf 

的問題,至少在部分,碼頭的上下文是my-git-root/docker /。

本着不可變服務的精神,我希望容器擁有git存儲庫的快照,而不是容器中的apt-get install'ing git並將數據拉出。但是我沒有看到如何做這個工作,除非我把Docker的東西分離出來放到一個單獨的git倉庫中,然後在每一個版本上克隆web應用程序 - 我寧願不讓任何人試圖在生活中勉強接受容器。

關於更理智的工作流程的建議?

回答

2

「在永恆不變的服務精神,...把數據」

如果你在你的dockerfile這樣做,然後這發生在容器的創建時間,而不是運行時。因此,每個版本的容器都將具有特定版本的數據。如果您使用與您的Web應用程序回購的版本標籤相匹配的標籤來部署容器,那麼將很清楚您在每個容器中運行的是哪個版本的Web應用程序。

「apt-get的install'ing混帳」

您可以使用GitHub的HTTP接口,在一個特定的標籤,下載web應用程序的壓縮包或提交哈希,因此不能拉動最新的和可能破碎的webapp。

在Dockerfile我想說...

如果移動dockerfile你可以使用copy命令的混帳回購協議的根源,你表現出作爲整個代碼變得的一部分碼頭上下文。這在碼頭回購中是很常見的做法。

我建議在其自己的Git回購的通用nginx的容器,它不會複製Web的應用程序/在構建時服務「上更理智的工作流程..建議」。在運行代碼的主機上以卷的形式安裝web-app。然後,您可以使用任何方法(docker外部)將您當前的代碼狀態置於服務器上。您的碼頭集裝箱在任何時候都可以獨立於代碼的狀態。當你需要修復你的nginx設置而不必尋找容器中的代碼時,這將有所幫助。

有時您無法訪問主機fs,即如果您在Amazon Elastic Beanstalk上運行。在那種情況下,我會建議我有上面提到的nginx容器的通用容器。然後在您的web應用程序項目的根目錄中使用with myNginx:version6並在正確的位置複製web-app文件夾中的dockerfile。該容器可以與myApp:SomeVersion一起部署。通過這種方式,您可以使用任何與部署有關的問題以及使用代碼進行版本控制的myApp容器來提供一個衆所周知的Nginx容器。

有關於這些方法的討論here其中所羅門海克斯解決這個問題。

+0

是「將dockerfile移動到git repo的根目錄」; 「將web應用程序安裝爲音量」爲-1。這不是「不變的服務精神」。 – Bryan 2014-12-05 17:40:40