簡體   English   中英

如何更新Docker容器映像但保留容器應用程序生成的文件

[英]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。


這進入了圖像和容器設計的基本實踐,最好通過將應用程序分為三部分來完成:

  1. 應用程序代碼,二進制文件,庫和其他運行時依賴項。
  2. 應用程序訪問和創建的持久數據。
  3. 修改應用程序運行方式的配置,尤其是在具有相同代碼的不同環境中。

這些部分中的每一個都應放在docker中的不同位置。

第一部分, 代碼和二進制文件,將出現在您的圖像中 這是您要在Docker中的不同節點上運行容器的工具,也是存儲在注冊表中以供以后重用的工具。

第二部分,您的持久性數據將存儲在volume中 卷有兩種主要類型可供選擇:命名卷和主機卷(也稱為綁定安裝)。 命名卷具有提高可移植性的特殊功能,當首次創建該卷時,它將在該卷位置處初始化為映像的內容。 此初始化包括目錄和文件的權限以及所有權,可用於以初始狀態為卷添加種子。 主機卷(綁定掛載)只是從Docker主機到容器的目錄掛載,您可以確切了解主機上的內容,包括文件/目錄的uid / gid,並且無需初始化過程。 主機卷對於開發人員而言非常易於訪問,但是如果您移入多節點集群集群,則缺乏可移植性,並且主機上的uid / gid會映射到容器內的其他用戶,因為容器內的用戶名可能不同相同的ID。 您在容器內寫入的任何未寫入卷的文件都應視為一次性文件,並且在重新創建容器以更新到新映像時會丟失。 並且,您定義為卷的任何目錄都應視為該卷的所有者,並且在替換容器時不會從映像接收更新。

最后一部分,配置,通常被忽略,但同樣重要。 這是在啟動時注入到應用程序中的所有內容,以告訴應用程序外部數據的連接位置,更改其行為的配置文件,以及需要分隔以允許同一圖像在不同環境中重用的所有內容。 這是您如何從具有相同圖像的開發到生產的可移植性,以及如何獲得公開提供的圖像的可重用性。 配置注入了環境變量,命令行參數,配置文件的綁定安裝(當您在單個節點上運行時),以及配置+機密,它們與現在存儲在docker's swarm中的配置文件的綁定安裝基本上相同而不是在單個主機上本地。 在您的情況下,/ web.config看起來像一個配置文件,您想將其移出映像並作為綁定安裝或群集配置進行注入。

為了將所有這些放在一起,您將需要一個組成文件,該文件定義映像,要使用的卷以及要設置的任何配置或環境變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM