在单声道存储库中使用 Lerna 对多个 Node 应用程序进行 Docker化



我的单存储库和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-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

任何帮助表示赞赏。

我曾经参与的一个开源项目就是这样做的。他们有一个包含多个软件包的单存储库(每个软件包都是 Dockerfile(。他们将 CircleCI 用于 CI 管道,IIRC 将所有包依赖项都分配到单个虚拟 nodejs 映像中,该映像的存在仅用于将依赖项提供给所有其他映像。这涉及将nodejs映像置于根级别,并使用Yarn的工作区功能将所有包级deps"提升"到单个根级别映像中。

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

  1. 在根部创建 Dockerfile,用 Yarn 提升所有部门
  2. 在每个软件包中 Dockerfile,挂载持久、共享的 deps 卷来代替安装它们
  3. 在 CI 管道或 Docker-Compose 中,首先构建根级映像,然后运行其中的yarn bootstrapyarn coverage等。在构建其他容器之前,您需要确保此容器处于活动状态 - 您可以使用诸如wait-for-it之类的脚本来执行此操作(这是特定于Docker的使用信息(

同样,我希望我能给你一个更详细的答案,但我希望这至少有助于给你一些想法。

相关内容

最新更新