gpt4 book ai didi

node.js - 如何在具有 yarn 工作空间的 monorepo 中从 nodejs 项目构建 docker 镜像

转载 作者:IT老高 更新时间:2023-10-28 12:42:46 26 4
gpt4 key购买 nike

我们目前正在与我们的团队一起为我们的网站研究 CI/CD。我们最近还适应了 monorepo 结构,因为这使我们的依赖关系和概览变得更加容易。目前测试等已为 CI 做好准备,但我现在正在部署。我想创建所需包的 docker 镜像。

我考虑的事情:

1) 将完整的 monorepo 拉入 docker 项目,但在我们的项目中运行 yarn install 会导致项目总大小约为 700MB,这主要是由于我们的 react native 应用程序甚至不应该有 docker 镜像。此外,每次我们必须部署新版本时,这都会导致很长的图像拉取时间

2) 以某种方式捆绑我的项目。使用我们的前端,我们有工作设置,所以应该没问题。但我只是尝试将 webpack 添加到我们的express api 并由于这个问题在我的包中出现错误:https://github.com/mapbox/node-pre-gyp/issues/308

3) 我尝试只在需要的项目中运行 yarn install,但这仍然会为我的所有项目安装我的 node_modules。

4) 运行 npm 包:pkg .这导致单个文件准备好在具有特定 Node 版本的特定系统上运行。这确实有效,但我不确定这将如何处理错误和崩溃。

5) 另一种解决方案是将项目复制到工作区之外并在那里运行 yarn install。这样做的问题是 yarn 工作空间(隐式链接依赖项)的使用已经过去了。我必须明确添加我的其他工作区依赖项。一种可能性是从某个提交哈希中引用它们,我现在将对其进行测试。 (编辑:您似乎不能将子目录作为 yarn 包引用)

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

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

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

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

主package.json(项目根目录下的那个)只包含一些devDependencies,如eslint、test runner等

一个单独的 Dockerfile 看起来像这样,假设 service1 依赖于 package1package3:

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

我使用的实际 Dockerfile 更复杂,因为它们必须构建子包、运行测试等。但是您应该通过这个示例了解想法。

如您所见,诀窍是只复制特定服务所需的包。yarn.lock 文件包含一个 package@version 列表,其中包含准确的版本和已解决的依赖关系。复制不带所有子包也没问题,安装包含包依赖时,yarn会使用那里解析的版本。

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

为了简洁起见,我在那个答案中省略了很多细节,如果有什么不是很清楚,请随时在评论中要求准确。

关于node.js - 如何在具有 yarn 工作空间的 monorepo 中从 nodejs 项目构建 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50215553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com