【发布时间】:2019-08-26 23:59:51
【问题描述】:
该容器是在部署应用程序时构建的。
看起来它的目的是跨模块共享依赖关系。
看起来它是作为容器启动的,但显然没有运行,有点像 init 容器。
控制台说它在使用各自的 wolkenkit start 和 wolkenkit stop 命令时启动/停止该组件。
启动时:
关机时:
当你docker ps时,找不到那个容器:
谁能解释一下这些组件?
【问题讨论】:
该容器是在部署应用程序时构建的。
看起来它的目的是跨模块共享依赖关系。
看起来它是作为容器启动的,但显然没有运行,有点像 init 容器。
控制台说它在使用各自的 wolkenkit start 和 wolkenkit stop 命令时启动/停止该组件。
启动时:
关机时:
当你docker ps时,找不到那个容器:
谁能解释一下这些组件?
【问题讨论】:
当启动wolkenkit 应用程序时,该应用程序被封装在多个 Docker 容器中,然后这些容器与其他一些提供基础设施的容器一起启动,例如数据库、消息队列……
之所以将应用程序拆分为多个 Docker 容器,是因为 wolkenkit 基于 CQRS 模式构建,该模式建议将应用程序的读取端与应用程序的写入端分开,因此读取端只有一个容器,并且一个用于写入端(实际上还有一些,但你明白了)。
现在,由于您可以在 Linux 以外的操作系统上进行开发,因此 wolkenkit 应用程序可能在与您开发时不同的操作系统下运行,因为在 Docker 中它始终是 Linux。这意味着启动命令不能简单地将node_modules 文件夹复制到容器中,因为它们可能包含二进制模块,这些模块随后不兼容(想象在主机上安装在 Windows 上,但在 Docker 内的 Linux 上运行)。
为避免此处出现问题,wolkenkit 在容器内启动应用程序时会运行 npm install。现在的问题是,如果 wolkenkit 在每个容器中都这样做,那么启动会非常慢(无论如何,这并不是地球上最快的事情,因为所有 Docker 的构建和启动都是在幕后发生的)。所以 wolkenkit 会尽量优化这个。
这里的一个概念是在它自己的容器内只运行一次npm install。这是您遇到的node-modules 容器。然后,此容器作为卷链接到包含应用程序代码的所有容器。这样你只需要运行一次npm install,但是多个容器可以使用这个命令的结果。
由于这个容器现在包含数据,但没有代码,它只需要在那里,它实际上并没有做任何事情。这就是它被创建但不运行的原因。
我希望这能让它更清楚一点,并且我能够回答你的问题 :-)
PS:请注意,我是 wolkenkit 的核心开发人员之一,所以请谨慎回答。
【讨论】: