如何将 NestJS monorepo 项目 Docker 化并进行部署?

5

我有一个NestJS的monorepo项目,其结构如下:

... 
apps   
  app1   
  app2   
  app3 
...

如果我正确理解了这个想法,我有可能在同一时间运行所有的应用程序,即我运行命令并通过路径访问应用程序,例如http://my.domain/app1/http://my.domain/app2/http://my.domain/app3/或类似方式。我需要将所有应用程序放在Docker容器中并从中运行。
我没有找到关于这个过程的信息。我是否正确理解了这个想法,我在哪里可以了解有关部署NestJS monorepo项目的更多信息?

请查看 https://blog.nrwl.io/nx-and-node-microservices-b6df3cd1bad6。 - hansi_reit
1个回答

5

我是这样解决的:

apps
  app1
    Dockerfile
    ...
  app2
    Dockerfile
    ...
  app3
    Dockerfile
    ...
docker-compose.yml

每个 Dockerfile 都是相同的:
 FROM node:16.15.0-alpine3.15 AS development
 WORKDIR /usr/src/app
 COPY package*.json ./
 RUN npm install
 COPY . .
 RUN npm run build
 FROM node:16.15.0-alpine3.15 AS production
 ARG NODE_ENV=production
 ENV NODE_ENV=${NODE_ENV}
 WORKDIR /usr/src/app
 COPY package*.json ./
 RUN npm install --only=production --omit=dev
 COPY --from=development /usr/src/app/dist ./dist
 CMD ["npm", "run", "start-app1:prod"]

最后一行应该启动应用程序,因此请根据您的项目命名进行调整。

稍后,在CI / CD管道中,您应该逐个构建每个镜像并将它们部署。要从项目的根目录运行docker构建,您只需要提供-f参数的Dockerfile路径,例如:

 docker build -f apps/app1/Dockerfile -t app1:version1 .
 docker build -f apps/app2/Dockerfile -t app2:version1 .
 docker build -f apps/app3/Dockerfile -t app3:version1 .

为了在本地进行测试,可以使用 docker-compose.yml 文件。

  version: '3.8'
  services:
    app1:
      image: app1:version1
      ports:
        - 3000:3000 # set according to your project setup
    app2:
      ... 
    app3:
      ...

通过调用docker compose up来启动它。


请问您能否澄清需要使用卷的原因? - Emmanuel Gabriel
@EmmanuelGabriel,在最简单的情况下,它们是不必要的。我已将其从示例中删除。对于造成的困扰,我很抱歉。当您频繁更改package.json并使用“nest start”启动应用程序时,这些卷非常有用,尤其是在本地开发方面。 - denu
以上示例似乎不支持单体库中每个模块之间的引用,因为Docker是从API本身触发的,而不是在根文件夹中触发。 - Frey
嘿 @denu,我在想如果在一个 NestJS monorepo 中只有一个项目级的 package.json 文件,那么这样的应用级 Dockerfiles 怎么能工作呢?我是不是漏掉了什么东西? - pitazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接