如何在 Docker 容器内的 NestJs 应用程序中观察文件更改

Mat*_*tto 5 typescript docker docker-compose nestjs

我在使用NestJSDocker 时遇到问题。我想通过 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
Run Code Online (Sandbox Code Playgroud)

还有我的 Nest 应用程序的Dockerfile

FROM node:10-alpine
WORKDIR /api/messages
ADD . .
RUN npm install
EXPOSE 3000
CMD ["npm", "run", "start"]
Run Code Online (Sandbox Code Playgroud)

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

"start:dev": "tsc-watch -p tsconfig.build.json --onSuccess \"node dist/main.js\"",
Run Code Online (Sandbox Code Playgroud)

控制台输出显示了我这一点,但应用程序不到风度检测文件的变化:

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*tto 7

我现在可以工作了:)

关键是在 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
Run Code Online (Sandbox Code Playgroud)


Daz*_*kin 0

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

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

使用源哈希值的图像标签允许您将图像与提交相匹配