首页 > 解决方案 > 在 Windows 容器重新启动之间保留对 Windows 注册表的更改

问题描述

给定一个在 Docker Windows 容器中运行的 Windows 应用程序,并且在运行时由正在运行的应用程序对 Windows 注册表进行更改,是否有一个 docker 开关/命令允许对 Windows 注册表的更改进行持久化,以便在容器运行时重新启动更改的值将被保留。

作为比较,文件更改可以通过暴露挂载点在容器重启之间持久化,例如

docker volume create externalstore
docker run -v externalstore:\data microsoft/windowsservercore

Windows 注册表的等效功能是什么?

标签: dockerdocker-for-windows

解决方案


我认为您在进行动态更改(容器的每次启动和停止都包含您要保存以供下次运行使用的不同用户密钥),例如漫游配置文件,而不是一组静态注册表设置,但我正在编写静态因为这是一个更容易和更有可能的答案。

值得注意的是容器图像之间的区别。

图像是静态模板。

容器是从映像启动的,虽然它们可以停止和重新启动,但对于大多数企业设计(例如 Kubernetes),您通常在每次执行后将它们完全丢弃。

如果您希望像 VM 一样运行 docker 容器(通常不推荐),停止和启动它,您的注册表设置应该在运行之间保持不变。

可以使用docker commit命令将容器转换为图像。在此方法中,您将启动容器,进行所需的更改,然后将容器提交到映像。新容器将从新映像启动。虽然这是可能的,但出于与不克隆机器或升级操作系统相同的原因,并不真正推荐它。您将获得图像中并不真正想要的额外工件(文件、设置、日志)。如果重复这样做,它最终会像一个糟糕的复印件。

进行静态更改的更好方法是使用dockerfile构建新图像。您需要阅读该内容(超出此答案的范围),但实际上您正在编写一个 docker 脚本,该脚本将对现有 docker 映像进行更改并将其保存到新映像中(使用 完成docker build)。这样做的好处是它更干净,更可重复,并且构建过程的每个步骤都是分层的。层有利于节省空间。使用 windowsservercore 基础和应用层制作的映像,然后复制到另一台已经拥有 windowsservercore 基础副本的机器,只会占用应用层的额外空间。

如果您想重复创建容器并对其应用一致的设置但构建新映像,您可以做几件事:

  • 使用脚本挂载卷并设置容器/映像的执行点以运行该脚本。该脚本可以导入注册表设置,然后启动您最初用作执行点的任何应用程序,请注意该脚本需要是一个连续循环。MS SQL Developer 镜像就是一个很好的例子,https://github.com/Microsoft/mssql-docker/tree/master/windows/mssql-server-windows-developer。该脚本可以导出您想要的设置。不确定是否有一种简单的方法可以检测“关闭”并让它在此时运行,但您可以轻松地将其设置为循环运行,连续写入已安装的卷。
  • 利用 Docker Compose 或 Kubernetes 等控制系统为您处理设置(不确定这对于注册表设置有多实用)
  • 让应用程序设置注册表设置
  • 打开容器的端口,允许远程管理容器(出于安全原因不推荐)
  • 在容器中的注册表文件所在的位置挂载一个卷(我不确定这些在哪里,或者这是否可以正常工作)

TL;DR:您应该使用 dockerfile 制作新图像以进行静态更改。对于动态更改,您可能需要使用一些巧妙的脚本。


推荐阅读