2017-05-19 29 views
2

VOLUME指令應該用於顯示由docker容器創建的任何數據庫存儲區域,配置存儲或文件/文件夾。強烈建議您將VOLUME用於圖像的任何可變和/或用戶可用部分。使用卷的代碼是碼頭最佳實踐嗎?

你會存儲你的代碼量嗎?

比如你的jar文件。在不重建圖像的情況下部署應用程序可能會有點方便。
如果將代碼存儲在卷中,是否有任何注意事項?如性能,安全性或其他。

回答

1

我不建議在Dockerfile中使用VOLUME語句來處理當前版本的docker(當前是引入命名卷後的任何版本的docker)。包括VOLUME命令有多個缺點,包括:

  • 可能不能以與任何以後的步驟或子圖像的圖像的該位置改變的內容(這種行爲似乎與不同的場景和不同的版本搬運工的不同)
  • 潛力,創建卷只爲弄亂docker volume ls輸出都很難找到,並且之後重用,如果你需要內部
  • 您更改代碼的數據,如果你把它在一個卷名稱的哈希值並從新版本的圖像中重新創建容器,該卷仍然具有c的舊副本除非您更新量自己ODE(卷的主要特點是,你不想迭代之間保持持久性數據)

我建議把你的數據在你的docker run命令行上定義卷或者在docker-compose.yml中。在那裏定義的卷可以有一個名稱或映射回到docker主機上的路徑。您可以製作任何文件夾或文件卷,而無需在Dockerfile中定義它。此步驟定義的卷不會影響圖像,允許您擴展圖像而不被鎖定而無法更改目錄。

對於您的代碼,如果在應用程序開發過程中解釋了代碼(例如,javascript)或已經編譯過的代碼(例如jar文件),那麼注入代碼的常用最佳實踐。您可以在容器上定義容量(不是Dockerfile),並使用相同的文件名覆蓋也被複制到映像中的代碼或二進制文件。這使您可以快速迭代開發,而無需頻繁重建圖像。根據應用程序的不同,您可能能夠重新加載代碼,否則應該重新啓動容器以查看最新更改。一旦開發完成,您可以使用當前代碼重新構建映像,並將其發送給可以使用它的人,而無需爲代碼安裝卷。

我也blogged about my concerns with volumes inside of Dockerfiles如果你想看到更多的細節。

+0

我在dockerfile中獲得該卷是可怕的。 回到我的問題。我也可以通過登錄容器覆蓋代碼,對吧?那麼怎麼才能通過一個卷注入代碼是一種常見的最佳做法。 – Cypine

+0

如果您使用exec登錄到容器中,則不應該在容器內部放置開發人員堆棧,因此通常會使用vim進行編輯,而不會將結果檢入到git中。容器也是牛,換成新的容器,失去了你的手編輯。將開發人員工作站的代碼作爲卷注入讓開發人員將代碼保留在原來的位置。 – BMitch

+0

在某些情況下有意義。謝謝 – Cypine

2

你說:

這可能是不重建圖像部署應用程序一點點方便。

取而代之的是,它將圖像構建中的應用程序版本封裝起來有很多好處。您只需部署映像即可輕鬆部署應用程序,因此,您將卷用於應用程序代碼的事實會導致您編排其他部署方法以更新該卷。

而且您必須(最終)將罐子版本與適當的圖像版本相匹配。

關於安全或性能,我不認爲有特殊的考慮。

無論如何,這不是一個常用的方法來使用卷。正如@BMitch所說,在Dockerfile中使用VOLUME是一件棘手的事情。