gpt4 book ai didi

node.js - 在 Mono 存储库中使用 Lerna Docker 化多个 Node 应用程序

转载 作者:行者123 更新时间:2023-12-02 19:51:45 25 4
gpt4 key购买 nike

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

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

在我集成 Lerna 之前,一切都很好,但现在我已经集成了 Lerna,我不知道我必须在哪个部分/步骤中调用 lerna bootstrap因为在调用此命令后我的 node_modules将自动构建,我不再需要单独运行 npm install在每个 Dockerfile .我不明白这一切会是什么样子,我是否必须创建另一个 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-ssr.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


任何帮助表示赞赏。

最佳答案

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

我希望我能提供更全面的例子,但已经很长时间了,我找不到这个项目。不过,你会做这样的事情:

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

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

    关于node.js - 在 Mono 存储库中使用 Lerna Docker 化多个 Node 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60173262/

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