【发布时间】:2019-10-11 04:05:05
【问题描述】:
我最近开始使用 lerna 来管理一个 monorepo,并且在开发中它运行良好。
Lerna 在我的各种包之间创建符号链接,因此像 'tsc --watch' 或 nodemon 这样的工具可以很好地检测其他包中的更改。
但是我在这个环境中创建 docker 镜像时遇到了问题。
假设我们有一个具有这种结构的项目:
root
packages
common → artifact is a private npm package, this depends on utilities, something-specific
utilities → artifact is a public npm package
something-specific -> artifact is a public npm package
frontend → artifact is a docker image, depends on common
backend → artifact is a docker image, depends on common and utilities
在这种情况下,在开发中,一切都很好。我正在运行某种实时重新加载服务器,并且符号链接可以正常工作,以便依赖项正常工作。
现在假设我想从后端创建一个 docker 映像。
我将介绍一些场景:
-
我在我的 Dockerfile 中
ADDpackage.json,然后运行 npm install。不起作用,因为未发布公共和实用程序包。
-
我在后端运行我的构建命令,在 docker 文件中添加 /build 和 /node_modules。
不起作用,因为我构建的后端有
require('common')和require('utilities')命令,它们位于 node_modules(符号链接)中,但 Docker 只会忽略这些符号链接文件夹。解决方法: 使用
cp --dereference来“取消符号链接”节点模块可以正常工作。请参阅此AskUbuntu question。 -
第 1 步,但在构建 docker 映像之前,我会发布 npm 包。
这没问题,但对于正在检查代码库并修改
common或utilities的人来说,它不会起作用,因为他们没有发布 npm 包的权限。 -
我将
backend的build命令配置为不将common或utilities视为外部,将common配置为不将something-specific视为外部。我认为首先构建
something-specific,然后是common,然后是utilities,然后是backend。这样,当构建发生时,并在 webpack 中使用这种技术,捆绑包将包含来自
something-specfic、common 和utilities的所有代码。但这管理起来很麻烦。
这似乎是我试图在这里解决的一个非常简单的问题。当前在我的机器上运行的代码,我想拉出并放入一个 docker 容器中。
请记住,我们在这里想要实现的关键是让某人能够检查代码库、修改任何包,然后构建 docker 映像,所有这些都来自他们的开发环境。
我在这里是否缺少明显的 lerna 技术,或者我可以用来考虑解决此问题的 devops 参考框架?
【问题讨论】:
-
您找到可行的解决方案了吗,我也面临类似的问题?
-
我不明白这个问题的方方面面:一个问题是构建所有尊重依赖的 npm 工件。 package.json 工作区功能还可以。 npm 不能很好地处理这个问题,yarn 做得更好,Lerna 增加了一些功能。第二个问题是构建多个 docker 镜像。每个子项目都有自己的 Dockerfile。然后 CI 和 CD 工具将完成剩下的工作,因为它们在构建 npm 工件后运行,它们将拥有构建 docker 映像的一切。
-
强制性 +1 - 很想知道您是否曾在这里提出过合理的解决方案 @dwjohnston
-
这里与我的问题有关:stackoverflow.com/questions/59320343/…
-
cp --dereference方法仅适用于在 monorepo 中没有使用同一库的不兼容版本的简单情况。
标签: microservices docker devops monorepo