如何更新 docker 容器镜像,但保留容器应用程序生成的文件
How to update docker container image but keep the generated files by container app
以下场景更新容器的最佳实践是什么;
我有基于我的 Web 应用程序项目构建的图像,并且我每月发布一次基于更新的源代码的新图像。
Buy my web app 在容器中 运行 后及时生成文件或更新一些文件。例如,应用程序正在为每个网络用户在用户文件夹下创建新的 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 功能吗?还有其他策略吗?
简短回答,是的,您确实需要这些目录的卷。更具体地说,两个卷:/user 和 /uploads。
这涉及图像和容器设计的基本实践,最好将您的应用程序分为三个部分:
- 应用程序代码、二进制文件、库和其他运行时间依赖项。
- 应用程序访问和创建的持久数据。
- 修改应用程序 运行 方式的配置,尤其是在具有相同代码的不同环境中。
这些部分中的每一个都应该放在 docker 的不同位置。
第一部分,代码和二进制文件,进入您的图像。这是您在 docker 的不同节点上运送到 运行 容器的内容,以及您存储在注册表中供以后重用的内容。
第二部分,您的 持久数据,存储在一个卷 中。有两种主要类型的卷可供选择:命名卷和主机卷(也称为绑定安装)。命名卷具有提高可移植性的特殊功能,当首次创建卷时,它将在卷位置初始化为您的图像内容。此初始化包括目录和文件权限以及所有权,可用于为您的卷播种初始状态。主机卷(绑定挂载)只是从 docker 主机到容器的目录挂载,您可以准确地了解主机上的内容,包括 files/directories 的 uid/gid,以及没有初始化程序。主机卷对于开发人员来说非常容易访问,但是如果你移动到 multi-node swarm 集群就缺乏可移植性,并且由于容器内的用户名,主机上的 uid/gid 映射到容器内的不同用户对于相同的 ID 可以不同。您在容器内写入但未写入卷的任何文件都应被视为一次性文件,并且在您重新创建容器以更新到新映像时将丢失。并且您定义为卷的任何目录都应被视为属于该卷,并且在您替换容器时不会从映像接收更新。
最后一块,配置,经常被忽视但同样重要。这是在启动时注入到应用程序中以告诉它在何处连接外部数据的任何内容、改变其行为的配置文件以及需要分离以允许在不同环境中重复使用相同图像的任何内容。这就是您如何使用相同的图像获得从开发到生产的可移植性,以及如何获得公开提供的图像的可重用性。 配置中注入了环境变量、命令行参数、配置文件的绑定挂载(当你在单个节点上 运行 时),以及 configs + secrets,它们本质上是相同的绑定挂载配置文件现在存储在 docker 的集群中,而不是本地存储在单个主机上。 在您的情况下,/web.config 看起来很像您想要的配置文件移出图像并作为绑定安装或群配置注入。
为了将所有这些放在一起,您需要一个定义映像、要使用的卷以及要设置的任何配置或环境变量的组合文件。
以下场景更新容器的最佳实践是什么;
我有基于我的 Web 应用程序项目构建的图像,并且我每月发布一次基于更新的源代码的新图像。
Buy my web app 在容器中 运行 后及时生成文件或更新一些文件。例如,应用程序正在为每个网络用户在用户文件夹下创建新的 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 功能吗?还有其他策略吗?
简短回答,是的,您确实需要这些目录的卷。更具体地说,两个卷:/user 和 /uploads。
这涉及图像和容器设计的基本实践,最好将您的应用程序分为三个部分:
- 应用程序代码、二进制文件、库和其他运行时间依赖项。
- 应用程序访问和创建的持久数据。
- 修改应用程序 运行 方式的配置,尤其是在具有相同代码的不同环境中。
这些部分中的每一个都应该放在 docker 的不同位置。
第一部分,代码和二进制文件,进入您的图像。这是您在 docker 的不同节点上运送到 运行 容器的内容,以及您存储在注册表中供以后重用的内容。
第二部分,您的 持久数据,存储在一个卷 中。有两种主要类型的卷可供选择:命名卷和主机卷(也称为绑定安装)。命名卷具有提高可移植性的特殊功能,当首次创建卷时,它将在卷位置初始化为您的图像内容。此初始化包括目录和文件权限以及所有权,可用于为您的卷播种初始状态。主机卷(绑定挂载)只是从 docker 主机到容器的目录挂载,您可以准确地了解主机上的内容,包括 files/directories 的 uid/gid,以及没有初始化程序。主机卷对于开发人员来说非常容易访问,但是如果你移动到 multi-node swarm 集群就缺乏可移植性,并且由于容器内的用户名,主机上的 uid/gid 映射到容器内的不同用户对于相同的 ID 可以不同。您在容器内写入但未写入卷的任何文件都应被视为一次性文件,并且在您重新创建容器以更新到新映像时将丢失。并且您定义为卷的任何目录都应被视为属于该卷,并且在您替换容器时不会从映像接收更新。
最后一块,配置,经常被忽视但同样重要。这是在启动时注入到应用程序中以告诉它在何处连接外部数据的任何内容、改变其行为的配置文件以及需要分离以允许在不同环境中重复使用相同图像的任何内容。这就是您如何使用相同的图像获得从开发到生产的可移植性,以及如何获得公开提供的图像的可重用性。 配置中注入了环境变量、命令行参数、配置文件的绑定挂载(当你在单个节点上 运行 时),以及 configs + secrets,它们本质上是相同的绑定挂载配置文件现在存储在 docker 的集群中,而不是本地存储在单个主机上。 在您的情况下,/web.config 看起来很像您想要的配置文件移出图像并作为绑定安装或群配置注入。
为了将所有这些放在一起,您需要一个定义映像、要使用的卷以及要设置的任何配置或环境变量的组合文件。