如何观看Docker容器内NestJs应用程序中开发的文件更改

时间:2019-07-31 19:28:04

标签: typescript docker docker-compose nestjs

我遇到 NestJS Docker 的问题。我想通过npm start:dev运行开发脚本,但问题是该应用程序可以正常运行,但无法检测到源文件中的任何更改,因此我无法使用它来开发我的应用程序。

这是我的 docker-compose.yml 的一部分:

messages:
   image: c2c/messages:v1
   command: npm run start:dev
   build:
     context: ./services/c2c-server-messages
     dockerfile: Dockerfile
   container_name: c2c_server_messages
   depends_on:
     - postgres
     - nginx
   networks:
     c2c_net:
       ipv4_address: 172.28.1.5

和我的Nest应用程序的 Dockerfile

FROM node:10-alpine
WORKDIR /api/messages
ADD . .
RUN npm install
EXPOSE 3000
CMD ["npm", "run", "start"]

我的 package.json 中的npm start:dev脚本:

"start:dev": "tsc-watch -p tsconfig.build.json --onSuccess \"node dist/main.js\"",

控制台输出向我显示了此内容,但该应用未检测到文件更改:

c2c_server_messages | 7:26:29 PM - Found 0 errors. Watching for file changes.
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [NestFactory] Starting Nest application...
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [InstanceLoader] TypeOrmModule dependencies initialized +63ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [InstanceLoader] AppModule dependencies initialized +2ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [InstanceLoader] TypeOrmCoreModule dependencies initialized +151ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [InstanceLoader] TypeOrmModule dependencies initialized +1ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [InstanceLoader] MessageModule dependencies initialized +2ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [RoutesResolver] AppController {/}: +8ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [RouterExplorer] Mapped {/, GET} route +6ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [RoutesResolver] MessageController {/messages}: +1ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [RouterExplorer] Mapped {/, POST} route +2ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [RouterExplorer] Mapped {/all, GET} route +2ms
c2c_server_messages | [Nest] 36   - 07/31/2019, 7:26 PM   [NestApplication] Nest application successfully started +5ms

2 个答案:

答案 0 :(得分:2)

我现在可以使用它了:)

关键是要在docker-compose中创建一个,其中包含您的微服务文件夹的本地计算机根文件夹,在本例中为 ./ services / c2c-server-messages 作为容器:/ api / messages

中应用程序的根目录

通过这种方式,您正在使用本地文件来运行应用程序,而不是将文件复制到容器中,因此在保存文件时可以监视更改。

示例:

  messages:
   image: c2c/messages:v1
   volumes:
    - ./services/c2c-server-messages:/api/messages
   command: npm run start:dev
   build:
     context: ./services/c2c-server-messages
     dockerfile: Dockerfile
   container_name: c2c_server_messages
   depends_on:
     - postgres
     - nginx
   networks:
     c2c_net:
       ipv4_address: 172.28.1.5

答案 1 :(得分:-1)

运行docker-compose ...时,它会寻找匹配的图像(c2c/messages:v1),如果是...

  • 在本地查找图像,然后运行
  • 找不到它,您的docker-compose.yaml将使docker-compose生成映像。

运行后,更改运行过程的一种方法是更改​​容器映像中的文件 ,然后触发进程以重新加载它们。但是,拥有“不可变”(不变)容器是一种好习惯。

您可以解决的一种方法是:

  • 将您的来源添加到来源控制中
  • 使用来源的某些唯一标识符来检测更改。

(通常是您来源的哈希,例如git git --rev-parse HEAD

如果您的源更改,则哈希将更改,您可以使用它来在docker-compose下一次启动时 触发图像的重建。一种简单的方法是:

  • TAG=$(git rev-parse HEAD)
  • 然后将哈希值用作图片的标签(而不是v1),例如c2c/messages:${TAG}

您的工作流程将变为:

  • 更改来源
  • 计算哈希值
  • docker-compose up...引用用哈希标记的图像以强制重建

使用源代码管理可以为您提供源代码的历史记录。

使用源哈希值的图像标签可以匹配要提交的图像