【发布时间】:2020-09-29 15:45:02
【问题描述】:
我想知道是否可以将容器图像的一层换成另一层。这是我的场景:
我有一个执行以下操作的 docker 文件:
- 它会拉取 .net core 3.1 debian slim (buster) 映像
- 构建我的应用程序的源代码并将其作为层添加到 .net 核心映像之上
当 .net core 3.1 运行时映像的新版本出现时,我想制作一个具有该新版本但在其上具有相同应用层的新映像。
我不想找到用于构建应用程序并重新构建的代码的确切版本。
这个想法是复制升级机器和运行时,但不对应用程序进行任何更改(更少测试升级)。
我可以使用 docker 命令换出一层图像吗?
【问题讨论】:
-
这是非常规的,需要解决一大堆模棱两可的技术问题才能正确做到这一点。我认为没有现有的
docker命令可以执行此操作,也没有为此目的设计的任何工具。此外,我不建议您这样做。 但是,我会回答你的问题 - 技术上,这是可能的。我正在开发一个概念验证工具,它能够为你交换基本图像(这是你所描述的)。我会尽快将其发布在答案中,但由于其复杂性,可能需要几天时间。 -
@concision - 我的公司目前在虚拟机上运行我们的定制软件。自动构建创建自定义软件,然后将其部署到该虚拟机。当虚拟机需要补丁或升级时,我们不重新编译代码,我们只是升级虚拟机(甚至可能制作一个新的虚拟机并将exe安装到它上面。)我正在寻找一种重新创建的方法这个场景使用容器。 (我可以升级操作系统,而无需重新构建我的代码。)这通常如何使用容器完成?
-
容器应该是短暂的——它们应该在卷中保存它们的持久状态或不在容器状态(即文件系统)内的另一种持久存储方式。如果所有持久数据都在容器的内部状态之外,那么重建基础 Docker 映像并在持久数据上创建具有相同卷的新更新容器就是您“升级”操作系统的方式。虚拟机的类比在这里不太适用,Docker 工作在一个完全不同的架构上,它有一个联合层文件系统,其中顶层依赖于底层。
-
此外,虽然我不能强调您应该从源代码重建,但通过直接编辑图像在技术上是可行的。但是,如果您尝试“升级”正在运行的容器的操作系统,则需要停止容器。由于这是一个有趣的非正统概念,我花一些时间尝试通过编写 CLI 工具来实现这一点。但是,为了实现这一点,您需要分别拥有原始基础镜像、新基础镜像和您希望“升级”的应用程序镜像。你知道/有那些你想“升级”的形象吗?
-
@Vaccano 这可能是一个愚蠢的问题,但是,您不能在运行 docker 的机器上保存二进制文件,并将volume 附加到容器上吗?在这种情况下,交换基础镜像将通过两个命令完成,docker container rm ... 和 docker container run(带有所需的参数)。
标签: docker containers