重新创buildDocker镜像而不是重用 – 用于微服务

一个微服务停留在一个docker集装箱中。 现在,假设我想升级微服务 – 例如,某些configuration已更改,我需要重新运行它。

我有两个select:

  1. 我可以尝试通过在容器启动时运行的脚本来重新使用现有映像,并通过从某个共享卷中读取新configuration(如果存在)来更新微服务。 更新之后,脚本运行微服务。

  2. 我可以简单地删除现有的图像和容器,并创build新的图像(新名称)和新的容器与更新的configuration/代码。

解决scheme#2对我来说似乎更加健壮。 没有“更新”过程,只有单个容器的创build。

然而,困扰我的是,如果这个图像的重新创造有一些不好的副作用? 像很多悬挂的图像或类似的东西。 想象一下,在用户使用应用程序的时候,这种情况可能会经常发生 – 例如,如果开发人员尝试了某些事情,他想要使用不同的微服务configuration,他会经常重新启动它。 但一旦configuration好了,这个不会改变。 另外,当我说configuration我不只是意味着configuration文件,而且用户代码等

对于生产更改,您需要部署新的映像以更改文件。 这确保您的过程是可重复的。

但是,每次编写新的代码行时,通过创build新的映像来进行开发将是一场噩梦。 最好的select是运行docker容器并将容器的源代码目录安装到文件系统中。 这样,当您在编辑器中进行更改时,容器中的代码也会更新。

你可以这样做:

docker run -v /Users/me/myapp:/src myapp_image

这样,您只需构build一次myapp_image ,然后轻松进行更改即可。

现在,如果你有一个没有安装的运行容器,并且你想修改文件,你也可以这样做。 这不是build议,但很容易看出你为什么想要。

如果你运行:

docker exec -it <my-container-id> bash

这会让你进入容器,你可以在你进入的时候在vim / nano / editor中进行更改。

您的选项#2绝对适用于生产环境。 理想情况下,你应该在这个过程中进行一些自动化操作,典型的做法是像蓝绿色的部署一样,将旧的映像逐一replace为新的映像,随时进行testing,只有当你满意时新部署是否清理以前版本的容器并删除映像。 这样,如果需要,您可以快速回滚到以前的版本。

在开发环境中,您可能希望采取不同的方法,在运行时绑定应用程序到容器中,从而允许您dynamic更新而无需重新构build映像。 在Docker Compose文档中有一个很好的例子,它说明了如何让一个共同的基础组成YML,然后对其进行扩展,以便在开发和生产场景中获得不同的行为。