[英]How to update docker container image but keep the generated files by container app
在以下情況下更新容器的最佳實踐是什么?
我有在我的Web應用程序項目上構建的圖像,並且每個月一次基於更新的源代碼填充新圖像。
在容器中運行后,購買我的Web應用程序會生成文件或及時更新某些文件。 例如,應用程序正在為每個Web用戶的用戶文件夾下創建新的xml文件。 另一個示例是用戶上傳文件。
我想在運行新的更新映像后保留這些文件而不會丟失。
/bin/
/first.dll
/second.dll
/other-soruces/
/some.cs
/other.cs
/user/
/user-1.xml
/user-2.xml
/uploads/
/images
/image-1.jpg
/web.config
我應該使用Docker的批量功能嗎? 還有其他策略嗎?
簡短的回答,是的,您確實需要這些目錄的卷。 更具體地說,有兩個卷:/ user和/ uploads。
這進入了圖像和容器設計的基本實踐,最好通過將應用程序分為三部分來完成:
這些部分中的每一個都應放在docker中的不同位置。
第一部分, 代碼和二進制文件,將出現在您的圖像中 。 這是您要在Docker中的不同節點上運行容器的工具,也是存儲在注冊表中以供以后重用的工具。
第二部分,您的持久性數據將存儲在volume中 。 卷有兩種主要類型可供選擇:命名卷和主機卷(也稱為綁定安裝)。 命名卷具有提高可移植性的特殊功能,當首次創建該卷時,它將在該卷位置處初始化為映像的內容。 此初始化包括目錄和文件的權限以及所有權,可用於以初始狀態為卷添加種子。 主機卷(綁定掛載)只是從Docker主機到容器的目錄掛載,您可以確切了解主機上的內容,包括文件/目錄的uid / gid,並且無需初始化過程。 主機卷對於開發人員而言非常易於訪問,但是如果您移入多節點集群集群,則缺乏可移植性,並且主機上的uid / gid會映射到容器內的其他用戶,因為容器內的用戶名可能不同相同的ID。 您在容器內寫入的任何未寫入卷的文件都應視為一次性文件,並且在重新創建容器以更新到新映像時會丟失。 並且,您定義為卷的任何目錄都應視為該卷的所有者,並且在替換容器時不會從映像接收更新。
最后一部分,配置,通常被忽略,但同樣重要。 這是在啟動時注入到應用程序中的所有內容,以告訴應用程序外部數據的連接位置,更改其行為的配置文件,以及需要分隔以允許同一圖像在不同環境中重用的所有內容。 這是您如何從具有相同圖像的開發到生產的可移植性,以及如何獲得公開提供的圖像的可重用性。 配置注入了環境變量,命令行參數,配置文件的綁定安裝(當您在單個節點上運行時),以及配置+機密,它們與現在存儲在docker's swarm中的配置文件的綁定安裝基本上相同而不是在單個主機上本地。 在您的情況下,/ web.config看起來像一個配置文件,您想將其移出映像並作為綁定安裝或群集配置進行注入。
為了將所有這些放在一起,您將需要一個組成文件,該文件定義映像,要使用的卷以及要設置的任何配置或環境變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.