node.js - Nodemon 不会在 docker 中使用 Express 更改时重新加载文件

标签 node.js docker express

我使用express-generator生成了一个项目,并且正在对各种文件进行更改 - 从app.js到路由,没有任何东西导致nodemon更新。这一切都在一个 docker 容器中,该容器正确显示文件更改(我已经监视了 docker shell 中的文件以确保 docker 正在更新它们,而且确实如此)。

我的 app.js 和 bin/www 文件是标准的express-generator 文件。

package.json:

{
  "name": "api",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon -L --watch . ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1"
  }
}

我尝试过nodemon -L ./bin/www,没有-L,指定完整的文件系统路径(/src/),以及其他一些东西,但nodemon只是不监视更改。

Dockerfile Node :

FROM node:14-alpine as base

WORKDIR /src
COPY ./API/package*.json /src/
EXPOSE 3000

FROM base as production
ENV NODE_ENV=production
RUN npm ci
COPY ./API/ /src
CMD ["npm", "run", "start"]

FROM base as dev
ENV NODE_ENV=development
RUN npm install -g nodemon && npm install
COPY ./API/ /src
CMD ["npm", "run", "dev"]

相关的 docker-compose.yml 部分(使用 docker-compose 3.8 版本):

   api:
      build:
        context: ./
        dockerfile: Dockerfile-node
        target: dev
      container_name: API
      depends_on:
        - db
      restart: always
      volumes:
        - ./API:/src
      #command: npm run dev
      env_file: ./.env
      environment:
        DB_HOST: db
        DB_PORT: 3306
        DB_NAME: $DB_NAME
        DB_USER: $DB_USER
        DB_PASSWORD: $DB_PASSWORD
        NODE_ENV: development
        DEBUG: nodejs-docker-express:*
      ports:
        - "3000:3000"
      stdin_open: true
      tty: true

Node 容器的 Docker 输出:

[nodemon] 2.0.14

[nodemon] to restart at any time, enter `rs`

[nodemon] watching path(s): *.*

[nodemon] watching extensions: js,mjs,json

[nodemon] starting `node bin/www`

我做错了什么?

最佳答案

我相信您不应该像现在这样使用目录路径,只需直接使用目录名称即可。 --watch src bin 而不是 --watch 。 ./bin.我认为 nodemon 内部使用 glob 或其他东西来解析该路径,如果您使用 ./ 它会破坏它(我不确定那个)。

也不要监视根目录上所有可能的文件,指定您实际想要监视的目录,否则您将在不必要的事情上添加大量额外的递归监视。

https://github.com/remy/nodemon#monitoring-multiple-directories .

进一步阅读他们的文档,他们还提到在某些情况下使用带有已安装驱动器的容器可能会导致问题,然后他们建议使用 --legacy-watch 标志,该标志将在内部使用乔基达尔。如果修复路径名不起作用,您可以尝试这样做。

我相信您的问题是 [nodemon] 监视路径:*.*./ 解析不正确,并尝试监视所有路径或其他内容.

还需要注意的是,nodemon 将在当前工作目录中运行,因此如果您使用 --watch src bin,请确保运行时您实际上位于项目根目录中。

关于node.js - Nodemon 不会在 docker 中使用 Express 更改时重新加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69934172/

相关文章:

javascript - 如何将这段代码打印成 HTML?

java - Docker 容器中的 Wildfly 无法启动

linux - 如何通过 SSH 从 jenkins execute shell 进入正在运行的 docker 容器

docker - 在Linux/Windows集群上部署服务时Kubernetes “Failed create pod sandbox”错误

javascript - 向 Node.js 上的 azure 函数添加中间件函数

node.js - app.use 和 app.get 与 express.static 有什么区别?

javascript - 为什么我在尝试使用 Express 和 Body Parser 发帖时收到 "name undefined"

javascript - Cookie 不会存储在本地主机中

node.js - Nodejs/Golang aes 256解密

node.js - Mongodb多文档插入忽略自定义重复字段报错