VOLUME指令應該用於顯示由docker容器創建的任何數據庫存儲區域,配置存儲或文件/文件夾。強烈建議您將VOLUME用於圖像的任何可變和/或用戶可用部分。使用卷的代碼是碼頭最佳實踐嗎?
你會存儲你的代碼量嗎?
比如你的jar文件。在不重建圖像的情況下部署應用程序可能會有點方便。
如果將代碼存儲在卷中,是否有任何注意事項?如性能,安全性或其他。
VOLUME指令應該用於顯示由docker容器創建的任何數據庫存儲區域,配置存儲或文件/文件夾。強烈建議您將VOLUME用於圖像的任何可變和/或用戶可用部分。使用卷的代碼是碼頭最佳實踐嗎?
你會存儲你的代碼量嗎?
比如你的jar文件。在不重建圖像的情況下部署應用程序可能會有點方便。
如果將代碼存儲在卷中,是否有任何注意事項?如性能,安全性或其他。
我不建議在Dockerfile中使用VOLUME
語句來處理當前版本的docker(當前是引入命名卷後的任何版本的docker)。包括VOLUME
命令有多個缺點,包括:
docker volume ls
輸出都很難找到,並且之後重用,如果你需要內部我建議把你的數據在你的docker run
命令行上定義卷或者在docker-compose.yml中。在那裏定義的卷可以有一個名稱或映射回到docker主機上的路徑。您可以製作任何文件夾或文件卷,而無需在Dockerfile中定義它。此步驟定義的卷不會影響圖像,允許您擴展圖像而不被鎖定而無法更改目錄。
對於您的代碼,如果在應用程序開發過程中解釋了代碼(例如,javascript)或已經編譯過的代碼(例如jar文件),那麼注入代碼的常用最佳實踐。您可以在容器上定義容量(不是Dockerfile),並使用相同的文件名覆蓋也被複制到映像中的代碼或二進制文件。這使您可以快速迭代開發,而無需頻繁重建圖像。根據應用程序的不同,您可能能夠重新加載代碼,否則應該重新啓動容器以查看最新更改。一旦開發完成,您可以使用當前代碼重新構建映像,並將其發送給可以使用它的人,而無需爲代碼安裝卷。
我也blogged about my concerns with volumes inside of Dockerfiles如果你想看到更多的細節。
你說:
這可能是不重建圖像部署應用程序一點點方便。
取而代之的是,它將圖像構建中的應用程序版本封裝起來有很多好處。您只需部署映像即可輕鬆部署應用程序,因此,您將卷用於應用程序代碼的事實會導致您編排其他部署方法以更新該卷。
而且您必須(最終)將罐子版本與適當的圖像版本相匹配。
關於安全或性能,我不認爲有特殊的考慮。
無論如何,這不是一個常用的方法來使用卷。正如@BMitch所說,在Dockerfile中使用VOLUME
是一件棘手的事情。
我在dockerfile中獲得該卷是可怕的。 回到我的問題。我也可以通過登錄容器覆蓋代碼,對吧?那麼怎麼才能通過一個卷注入代碼是一種常見的最佳做法。 – Cypine
如果您使用exec登錄到容器中,則不應該在容器內部放置開發人員堆棧,因此通常會使用vim進行編輯,而不會將結果檢入到git中。容器也是牛,換成新的容器,失去了你的手編輯。將開發人員工作站的代碼作爲卷注入讓開發人員將代碼保留在原來的位置。 – BMitch
在某些情況下有意義。謝謝 – Cypine