【问题标题】:How to update docker container image but keep the generated files by container app如何更新 docker 容器映像但通过容器应用程序保留生成的文件
【发布时间】:2018-03-21 10:24:53
【问题描述】:

以下场景更新容器的最佳做法是什么;

我有基于我的 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 的volume 功能吗?还有其他策略吗?

【问题讨论】:

    标签: docker docker-compose docker-volume


    【解决方案1】:

    简短的回答,是的,您确实需要这些目录的卷。更具体地说,两个卷:/user 和 /uploads。


    这涉及到图像和容器设计的基本实践,最好将您的应用程序分成三个部分:

    1. 应用程序代码、二进制文件、库和其他运行时依赖项。
    2. 应用程序访问和创建的持久数据。
    3. 修改应用程序运行方式的配置,尤其是在具有相同代码的不同环境中。

    这些部分中的每一个都应该放在 docker 中的不同位置。

    第一部分,代码和二进制文件,放入您的图像。这是您在 docker 的不同节点上运行容器的内容,以及您存储在注册表中以供以后重用的内容。

    第二部分,您的持久数据,存储在卷中。有两种主要类型的卷可供选择:命名卷和主机卷(也称为绑定挂载)。命名卷具有提高可移植性的特殊功能,当第一次创建卷时,它将在卷位置初始化为映像的内容。此初始化包括目录和文件权限和所有权,并可用于为您的卷播种初始状态。主机卷(绑定挂载)只是从 docker 主机到容器的目录挂载,您可以准确地获得主机上的内容,包括文件/目录的 uid/gid,而无需初始化过程。主机卷对于开发人员来说非常容易访问,但是如果您移动到多节点 swarm 集群中,则缺乏可移植性,并且主机上的 uid/gid 映射到容器内的不同用户,因为容器内的用户名可能不同同一个id。您在容器内写入的任何未写入卷的文件都应被视为一次性文件,并且在您重新创建容器以更新到新映像时将丢失。并且您定义为卷的任何目录都应视为该卷拥有,并且在您更换容器时不会从映像接收更新。

    最后一点,配置,经常被忽视,但同样重要。这是在启动时注入应用程序的任何东西,告诉它在哪里连接外部数据,改变其行为的配置文件,以及任何需要分开以允许相同图像在不同环境中重用的东西。这就是您如何使用相同的图像从开发到生产获得可移植性,以及如何获得公开提供的图像的可重用性。 配置注入了环境变量、命令行参数、配置文件的绑定挂载(当您在单个节点上运行时)和配置+机密,它们本质上与现在存储的配置文件的绑定挂载相同在 docker 的 swarm 中而不是在单个主机上本地。 在您的情况下,/web.config 看起来很像一个配置文件,您需要将其移出映像并作为绑定挂载或 swarm 配置注入.

    要将所有这些放在一起,您需要一个 compose 文件来定义您的映像、要使用的卷以及要设置的任何配置或环境变量。

    【讨论】:

    • 我来自推特。不错的提示。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多