typescript 如何在Docker容器内的NestJs应用程序中查看文件更改

0sgqnhkj  于 2023-10-22  发布在  TypeScript
关注(0)|答案(4)|浏览(109)

我在使用NestJSDocker时遇到了问题。我想通过npm start运行开发脚本:但问题是,应用程序运行正常,但它没有检测到任何变化的源文件,所以我不能用它来开发我的应用程序。
这是我的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
nfeuvbwi

nfeuvbwi1#

我现在有它的工作:)
关键是在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
ifsvaxew

ifsvaxew2#

我花了5个小时才找到这个https://docs.nestjs.com/faq/common-errors#file-change-detected-loops-endlessly。
我也有类似的问题,通过将"watchOptions": { "watchFile": "fixedPollingInterval" }添加到tsconfig来解决。

yh2wf1be

yh2wf1be3#

当你运行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...引用使用哈希标记的图像以强制重建

使用源代码控制可以让您了解源代码的历史。
使用源哈希的图像标签可以让你匹配图像和提交

dldeef67

dldeef674#

只是增加了一个新的选项来实现这一点。现在有一个

docker compose watch

这将允许您将文件同步到服务容器中。
可用的操作包括

  • 同步
  • 重建
  • 同步+重新启动

docker compose文件示例:

services:
  web:
    build: .
    command: npm start
    develop:
      watch:
        - action: sync
          path: ./web
          target: /src/web
          ignore:
            - node_modules/
        - action: rebuild
          path: package.json

更多详情可浏览https://docs.docker.com/compose/file-watch/

相关问题