在拥有良好/就绪镜像的情况下无需重建进行升级?

大家好。

是否可以在不重建整个镜像的情况下更新到新版本?

我正在考虑一种场景,其中两个 Discourse 应用在虚拟上是相同的,一旦我准备好其中一个的新镜像,我就可以用它来部署第二个 Discourse,并提供容器的所有配置/参数。

我猜对于这样的容器来说,唯一需要处理的就是 pg 数据库迁移?

这有意义吗?如果可能,如何实现,最好是不用修改任何源代码?

非常感谢,L。

您可以构建一个镜像,将其推送到仓库,然后使用 ./launcher start-cmd app 启动它,以获取启动容器的 docker 命令(但您需要将您的容器仓库替换为本地仓库)。

然而,之后您还需要迁移数据库、预编译资产等等。

如果您想避免停机时间,双容器设置允许您在旧容器继续运行时构建一个新容器,然后它会处理迁移之类的内容。

如果您想格外小心,可以在 app.yml 中设置 SKIP_POST_DEPLOYMENT_MIGRATIONS,然后在启动新容器后执行 rake db:ensure_post_migrations db:migrate。不执行此操作可能会迁移数据库,导致旧容器无法再使用它。这通常不是问题,而且持续时间不长。

停机时间对我来说不是问题。

我想到的两个应用——它们几乎相同——但又不完全一样。

两个应用将是不同的站点,意味着不同的数据库、卷、端口、名称……但它们将拥有相同的——可以这么说——基础论述(+ 相同的插件,相同的一切对该核心/基础至关重要的东西)。

在理想的 Discourse 世界中——如果这种情况尚不存在——对于这种情况,一旦首次/一次构建完成,这样的新镜像甚至可以直接与 Docker 工具一起使用——并且数据库或任何需要“迁移”到这种新镜像/Discourse 版本的内容,这种“次要”容器的启动/引导过程将——也许在环境变量的帮助下——决定检查/执行必要的数据库迁移。

主要优势——许多人可能已经想到了——是所有(或更多,如果有人这样做的话)容器/应用使用单一镜像。

您可以按照我描述的方式进行操作。还有一个新的方案正在制定中,它使得只使用一个镜像而无需重建成为可能。它不受支持,所以您需要在论坛或 GitHub 上仔细搜索。