33F*_*e33 16 node.js express docker monorepo yarn-workspaces
我们目前正在与我们的团队一起在我们的网站上查看CI/CD.我们最近也适应了monorepo结构,因为这使我们的依赖和概述更容易.目前测试等已准备好用于CI,但我现在正在进行部署.我想创建所需包的docker镜像.
我考虑的事情:
1)将完整的monorepo拉入docker项目,但在我们的项目中运行yarn安装导致总项目大小约为700MB,这主要是由于我们的本机应用程序甚至不应该有docker镜像.此外,每次我们必须部署新版本时,这都会导致图像拉长时间过长
2)以某种方式捆绑我的项目.我们的前端我们有工作设置,所以应该没问题.但是我只是尝试将webpack添加到我们的快速api中,并因此问题在我的捆绑包中出现错误:https://github.com/mapbox/node-pre-gyp/issues/308
3)我尝试仅在所需项目中运行yarn安装,但这仍将为我的所有项目安装我的node_modules.
4)运行npm包:pkg.这导致单个文件准备好在具有特定节点版本的特定系统上运行.这可行,但我不确定这将如何处理错误和崩溃.
5)另一种解决方案是将项目复制出工作区并在那里运行纱线安装.这个问题是使用纱线工作区(隐式链接的依赖关系)就好了.我必须明确地添加我的其他工作区依赖项.一种可能性是从某个提交哈希引用它们,我现在要测试它.(编辑:您似乎无法将子目录引用为纱线包)
6)???
我想知道我是否缺少一个选项,只为某个项目只有所需的node_modules,所以我可以保持我的docker图像小.
我已经按照与您相似的结构进行了一个项目,看起来像:
project
??? package.json
??? packages
? ??? package1
? ? ??? package.json
? ? ??? src
? ??? package2
? ? ??? package.json
? ? ??? src
? ??? package3
? ??? package.json
? ??? src
??? services
? ??? service1
? ? ??? Dockerfile
? ? ??? package.json
? ? ??? src
? ??? service2
? ??? Dockerfile
? ??? package.json
? ??? src
??? yarn.lock
Run Code Online (Sandbox Code Playgroud)
该services/文件夹在每个子文件夹中包含一项服务。每个服务都用node.js编写,并具有自己的package.json和Dockerfile。它们通常是Web服务器或基于Express的REST API。
该packages/文件夹包含不是服务的所有软件包,通常是内部库。
服务可以依赖一个或多个程序包,而不依赖于另一服务。一个程序包可以依赖于另一个程序包,而不取决于服务。
main package.json(位于项目根文件夹中的那个)仅包含一些devDependencies,例如eslint测试运行程序等。
一个人Dockerfile看起来像这样,假设同时service1取决于package1&package3:
FROM node:8.12.0-alpine AS base
WORKDIR /project
FROM base AS dependencies
# We only copy the dependencies we need
COPY packages/package1 packages/package1
COPY packages/package3 packages/package3
COPY services/services1 services/services1
# The global package.json only contains build dependencies
COPY package.json .
COPY yarn.lock .
RUN yarn install --production --pure-lockfile --non-interactive --cache-folder ./ycache; rm -rf ./ycache
Run Code Online (Sandbox Code Playgroud)
Dockerfile我实际使用的s更为复杂,因为它们必须构建子包,运行测试等。但是您应该从此样本中获得灵感。
如您所见,诀窍是仅复制特定服务所需的软件包。的yarn.lock文件包含package @ version的列表,其中包含确切的版本和相关性已解决。要在没有所有子软件包的情况下进行复制不是问题,在安装包含的软件包的依赖项时,yarn将使用在那里解决的版本。
在您的情况下,react-native项目将永远不会成为任何Dockerfile的一部分,因为它不依赖任何服务,因此节省了大量空间。
为了简洁起见,我在该答案中省略了许多细节,如果有不清楚的地方,请随时在注释中要求精确。
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |