如何从monorepo中的nodejs项目构建docker映像,并使用Thread工作区

我们目前正在与我们的团队为我们的网站调查CI/CD。我们最近还采用了monorepo结构,因为这使我们的依赖关系和概述更加容易。目前,测试etc已为CI做好准备,但我现在开始部署。我想创建所需软件包的docker图像

我考虑的事情:

1) 将完整的monorepo引入docker项目,但在我们的项目中运行Thread安装会导致项目总大小约为700MB,这主要是因为我们的react本机应用程序甚至不应该有docker映像。而且,每次我们必须部署一个新版本时,这将导致很长的映像提取时间

2) 以某种方式捆绑我的项目。与我们的前端,我们有工作设置,所以应该是好的。但我只是想把网页添加到我们的
express api,并因此问题导致我的捆绑包中出现错误:https://github.com/mapbox/node-pre-gyp/issues/308

3) 我尝试只在需要的项目中运行Thread install,但这仍然会为我的所有项目安装我的node_模块

4) 运行npm包:pkg。这将导致一个文件可以在具有特定节点版本的特定系统上运行。这确实有效,但我不确定这将如何处理错误和崩溃

5) 另一个解决方案是将项目从工作区中复制出来,并在那里运行一个安装程序。这样做的问题是,纱线工作区(隐式链接的依赖项)的使用已经一去不返了。我必须明确地添加我的其他工作区依赖项。一种可能是从某个提交散列引用它们,我现在要测试它。(编辑:您似乎不能将子目录作为纱线包引用)

6)

我想知道我是否遗漏了一个选项,即对于某个项目,只有所需的node_模块,这样我才能保持docker图像的小

我在一个类似于你的结构的项目中工作过,它看起来像:

项目
├── package.json
├── 包装
│   ├── 包装1
│   │   ├── package.json
│   │   └── src
│   ├── 包装2
│   │   ├── package.json
│   │   └── src
│   └── 包装3
│       ├── package.json
│       └── src
├── 服务
│   ├── 服务1
│   │   ├── Dockerfile
│   │   ├── package.json
│   │   └── src
│   └── 服务2
│       ├── Dockerfile
│       ├── package.json
│       └── src
└── 纱线锁

services/文件夹每个子文件夹包含一个服务。每个服务都是在node.js中编写的,并且都有自己的package.json和Dockerfile。
它们通常是基于Express的web服务器或RESTAPI

packages/文件夹包含所有不是服务的包,通常是内部库

服务可以依赖于一个或多个包,但不能依赖于另一个服务。
包可以依赖于另一个包,但不能依赖于服务

main package.json(项目根文件夹中的一个)仅包含一些devdependency,例如eslint、测试运行程序等

假设service1同时依赖于package1,则单个Dockerfile如下所示包装3:

来自节点:8.12.0-alpine作为基础
WORKDIR/项目
作为依赖项从基
#我们只复制所需的依赖项
复制软件包/软件包1软件包/软件包1
复制软件包/软件包3软件包/软件包3
复制服务/服务1服务/服务1
#global package.json仅包含生成依赖项
复制package.json。
收到,锁上。
运行纱线安装--生产--纯锁文件--非交互式--缓存文件夹。/ycache;rm-rf./ycache

我使用的实际Dockerfiles更为复杂,因为他们必须构建子包、运行测试等。但是您应该从这个示例中了解这一点

正如您所看到的,诀窍是只复制特定服务所需的包。
warn.lock文件包含[email protected]解决了确切的版本和依赖关系。要在没有所有子包的情况下复制它不是问题,当安装所包含包的依赖项时,Thread将使用在那里解决的版本

在您的情况下,react本机项目永远不会是任何Dockerfile的一部分,因为它不依赖任何服务,因此节省了大量空间

为了简洁起见,我在回答中省略了很多细节,如果有什么不太清楚的地方,请随意询问评论的准确性

发表评论