在单存储库中使用 Lerna 对多个 Node 应用程序进行 Dockerizing

Posted

技术标签:

【中文标题】在单存储库中使用 Lerna 对多个 Node 应用程序进行 Dockerizing【英文标题】:Dockerizing multiple Node apps with Lerna in mono repository 【发布时间】:2020-05-27 02:54:04 【问题描述】:

我的单存储库和 Docker 项目设置存在一些问题。

我想将 Lerna 用于我的单一存储库设置,并使用 Docker 进行项目构建。

在我集成 Lerna 之前一切正常,但现在我已经集成了 Lerna,我不知道在哪个部分/步骤中我必须调用 lerna bootstrap,因为在调用此命令后,我的 node_modules 将是自动构建,我不再需要在每个 Dockerfile 中单独运行 npm install。我不明白这一切会是什么样子,我是否必须为根文件夹创建另一个Dockerfile?如果是,那么我的docker-compose.yml 文件会是什么样子?一切都不清楚。

这是我的项目树的样子:

后端文件夹具有基本的 nestjs 设置,客户端文件夹具有基本的 Gatsby 设置。


.
├── backend
│   ├── Dockerfile
│   ├── nest-cli.json
│   ├── package.json
│   ├── README.md
│   ├── src
│   │   ├── app.controller.spec.ts
│   │   ├── app.controller.ts
│   │   ├── app.module.ts
│   │   ├── app.service.ts
│   │   └── main.ts
│   ├── test
│   │   ├── app.e2e-spec.ts
│   │   └── jest-e2e.json
│   ├── tsconfig.build.json
│   └── tsconfig.json
├── client
│   ├── Dockerfile
│   ├── gatsby-browser.js
│   ├── gatsby-config.js
│   ├── gatsby-node.js
│   ├── gatsby-s-s-r.js
│   ├── LICENSE
│   ├── package.json
│   ├── README.md
│   └── src
│       ├── components
│       │   ├── header.js
│       │   ├── image.js
│       │   ├── layout.css
│       │   ├── layout.js
│       │   └── seo.js
│       ├── images
│       │   ├── gatsby-astronaut.png
│       │   └── gatsby-icon.png
│       └── pages
│           ├── 404.js
│           ├── index.js
│           └── page-2.js
├── docker-compose.yml
├── lerna.json
├── package.json
├── README.md
└── tslint.json

客户端文件夹中的Dockerfile:

FROM node:12

EXPOSE 8000 9929 9230

WORKDIR /usr/src/app/client

RUN npm install -g gatsby-cli

COPY package*.json ./

COPY . .

RUN npm install

CMD ["gatsby", "develop", "-H", "0.0.0.0" ]

后端文件夹中的Dockerfile:

FROM node:12-alpine

WORKDIR /usr/src/app/backend

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "npm", "start" ]

根文件夹中的docker-compose.yml文件:

version: "3"

services:
  backend:
    image: docker-nestjs-backend
    build: ./backend
    command: npm run start:dev
    volumes:
      - ./backend:/usr/src/app/backend
      - /usr/src/app/backend/node_modules
    ports:
      - 3002:3000

  client:
    image: docker-gatsby-client
    build: ./client
    volumes:
      - ./client:/usr/src/app/client
      - /usr/src/app/client/node_modules
    ports:
      - "8000:8000"
      - "9929:9929"
      - "9230:9230"
    environment:
      - NODE_ENV=development
      - GATSBY_WEBPACK_PUBLICPATH=/
    depends_on:
      - backend

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

我曾经参与的一个开源项目就是这样做的。他们有几个包(每个包一个 Dockerfile)的 monorepo。他们将 CircleCI 用于 CI 管道,IIRC 将所有包依赖项分配到单个虚拟 nodejs 映像中,该映像仅用于为所有其他映像提供依赖项。这涉及将 nodejs 映像放在根级别,并使用 Yarn 的 Workspaces 功能将所有包级别的依赖“提升”到单个根级别的映像中。

我希望我能提供更详尽的例子,但是已经很久了,我找不到这个项目。不过,你会做这样的事情:

    在根目录下创建 Dockerfile,使用 Yarn 提升所有的依赖 在每个包 Dockerfile 中,挂载持久的、共享的 deps 卷来代替安装它们 在您的 CI 管道或 Docker-Compose 中,您首先构建根级映像并在其中运行 yarn bootstrapyarn coverage 等。在构建其他容器之前,您需要确保该容器处于活动状态 - 您可以使用类似 wait-for-it (here is Docker-specific usage info) 的脚本来执行此操作

再次,我希望我可以为您提供更详细的答案,但我希望这至少有助于为您提供一些想法。

【讨论】:

以上是关于在单存储库中使用 Lerna 对多个 Node 应用程序进行 Dockerizing的主要内容,如果未能解决你的问题,请参考以下文章

Lerna 包和 PublishBuildArtifactsV1 任务

有没有办法用 Lerna“刷新”一个导入的存储库?

Node中并行/异步的多个分页GET API调用

Node中并行/异步的多个分页GET API调用

Lerna bootstrap 不链接本地依赖项?

使用 yarn 工作区和 lerna 优先构建顺序