我使用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/