当文件更改时,Nodemon 不会在 docker 容器中重新加载

Nodemon doesn't reload in docker container when files change

我读了很多关于这个的帖子,但没有人解决任何问题。

有人说您必须在 nodemon 命令中添加 --legacy-watch(或 -L)。 其他人展示了几种不同的配置,显然 nodody 真的知道当 docker 容器内的卷发生文件更改时,您必须做什么才能实现服务器重启。

这是我目前的配置:

Docker 文件:

FROM node:latest

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# install nodemon globally
RUN npm install nodemon -g

# Install dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . /usr/src/app

# Exports
EXPOSE 3000

CMD ["npm", "start"]

docker-compose.yml

version: '3.1'

services:
    node:
        build: .
        user: "node"
        volumes:
        - ./:/usr/src/app
        ports: 
            - 3000:3000
        depends_on: 
            - mongo
        working_dir: /usr/src/app
        environment:
        - NODE_ENV=production
        expose:
        - "3000"
    mongo:
        image: mongo
        expose:
        - 27017
        volumes:
        - ./data/db:/data/db
        environment:
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: example

package.json

{
  "name": "node-playground",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon -L"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ejs": "^2.7.1",
    "express": "^4.17.1",
    "mongoose": "^5.7.1"
  },
  "devDependencies": {
    "nodemon": "^1.19.2"
  }
}

我也尝试了许多不同的设置。就像不全局安装 nodemon 而只是作为项目依赖项一样。还有 运行 docker-compse.yml 处的命令,我相信还有很多我现在不记得的命令。没有什么。

如果有人对此有任何把握,请提供帮助。谢谢!!!

我继续创建了一个示例容器和 repo 来展示如何实现这一点..

只需按照以下步骤操作,其中概述了如何在 Docker 容器内使用 nodemon


Docker 容器: at DockerHub

源代码: at GitHub


package.json:

{
  "name": "nodemon-docker-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start:express": "node ./index.js",
    "start": "nodemon"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^1.19.2"
  }
}

Docker文件:

FROM node:slim
WORKDIR /app
COPY package*.json ./
RUN apt-get update
RUN npm install
COPY . /app
# -or-
# COPY . .
EXPOSE 1337
CMD ["npm", "start"]

docker-compose.yml:(如果你正在使用它)

version: "3"
services:
  nodemon-test:
    image: oze4/nodemon-docker-test
    ports:
      - "1337:1337"

重现方式:

步骤 1 使用 DOCKER 运行: 如果您使用 DOCKER 则跳过(如果你是,请转到下面的第 1 步)下拉示例 docker 容器

docker run -d --name "nodemon-test" -p 1337:1337 oze4/nodemon-docker-test


步骤 1 使用 DOCKER-COMPOSE:

配置见上面的docker-compose.yml文件

  1. cd /path/to/dir/that/has/your/compose/file
  2. docker-compose up -d


第 2 步:验证应用程序是否正常工作

http://localhost:1337


第 3 步:检查容器日志,以获得基线

docker logs nodemon-test


第 4 步: 我已经包含了一个 bash 脚本来尽可能简单地编辑文件。我们需要在容器上弹出一个 shell,运行 bash 脚本 (change.sh)

  1. docker exec -it nodemon-test /bin/bash

  2. bash change.sh

  3. exit


第 5 步:再次检查日志以验证是否已进行更改并且nodemon已重新启动

docker logs nodemon-test



最后一张截图可以看到,修改后nodemon重启成功!



好的 非常感谢 MattOestreich 的回答。
现在我开始工作了,我不知道它是什么,我确实遵循了你的设置,但当然我正在使用 docker-compose,我也从中删除了一些东西。我也不再调用 mongo 图像,因为我在 Mongodb atlas 集群中设置了数据库。 我的实际配置: Dockerfile:

FROM node:12.10

WORKDIR /app

COPY package*.json ./

RUN apt-get update

RUN npm install

COPY . /app

EXPOSE 3000

CMD ["npm", "start"]

docker-compse.yml

version: '3.1'

services:
    node:
        build: .
        volumes:
        - ./:/app
        ports: 
            - 3000:3000
        working_dir: /app
        expose:
        - "3000"

package.json

{
  "name": "node-playground",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "dotenv": "^8.1.0",
    "ejs": "^2.7.1",
    "express": "^4.17.1",
    "mongoose": "^5.7.1"
  },
  "devDependencies": {
    "nodemon": "^1.19.2"
  }
}

再次感谢马特,我希望这篇文章能帮助像我这样有需要的人。

试试吧! 这对我有用:

通过 CLI,简称为 --legacy-watch-L。更多信息 here.

Nodemon 依赖于 Chokidar,一个潜在的解决方案是通过将 CHOKIDAR_USEPOLLING 环境变量设置为 true.

使其使用轮询

例如,您可以在 docker-compose.yml:

中执行此操作
services: 
    api1:
        build: 
            context: .
            dockerfile: Dockerfile
        volumes:
            - /app/node_modules
            - ${PWD}:/app
        ports:
            - 80:3000
        environment:
            - CHOKIDAR_USEPOLLING=true

Docker 文件中的更改

CMD ["npm", "start"]

更改启动脚本

"start": "nodemon -L server.js"

构建命令

docker build . -t <containername>

使用此命令 运行 docker 容器

docker run -v $(pwd):/app -p 8080:8080 -it <container Id>
  • -v = 卷。 Docker 容器生成和使用的持久化数据的首选机制。
  • /app = WORKDIR /app
  • $(pwd) = PWD 是设置为当前工作目录的变量。所以 $(pwd) 获取当前工作目录的值