重新启动Windows容器之间对Windows注册表的更改

时间:2019-05-02 05:07:06

标签: docker docker-windows

鉴于在Docker Windows容器中运行的Windows应用程序,并且正在运行的应用程序对Windows注册表进行运行更改时,是否存在一个docker switch /命令,可保留对Windows注册表的更改,因此,当容器重新启动后,更改的值将保留。

作为比较,可以通过暴露安装点(例如)来在容器重启之间持久保存文件更改。

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

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

1 个答案:

答案 0 :(得分:0)

我认为您是在进行动态更改(容器的每个起点和终点都包含您要保存用于下一次运行的不同用户密钥),例如漫游配置文件,而不是一组静态的注册表设置,但是为静态而写,因为它是一个更容易且更可能的答案。

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

图像是静态模板。

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

如果您希望运行像VM这样的docker容器(通常不建议这样做),请停止并启动它,则注册表设置应在两次运行之间保持不变。

可以使用docker commit命令将容器转换为图像。在这种方法中,您将启动容器,进行所需的更改,然后将容器提交给映像。新容器将从新映像开始。尽管这是可行的,但出于与克隆机器或升级操作系统不同的原因,我们不建议这样做。您将获得图像中真正不需要的其他工件(文件,设置,日志)。如果重复执行此操作,最终将导致复印不良。

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

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

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

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