【问题标题】:Nodemon doesn't reload in docker container when files change文件更改时,Nodemon 不会在 docker 容器中重新加载
【发布时间】:2023-03-26 09:50:01
【问题描述】:

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

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

这是我目前的配置:

Dockerfile:

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 上运行命令,我相信还有很多其他我现在不记得了。没有。

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

【问题讨论】:

  • 您是否在您的NPM 脚本中调用nodemon?又名npm start 是否包含nodemon 命令?你能提供你的package.json吗?我什至看不到您在哪里运行 nodemon 命令...
  • @MattOestreich 很抱歉,我忘记了那个文件。已编辑。
  • 您以用户 node 的身份运行容器,同时您还提供一个卷,该卷由主机系统中拥有它们的任何用户拥有。你确定你有正确的权限吗?
  • 那么你的容器启动了吗?容器内的应用程序是否响应?意思是,nodemon 启动您的应用程序,只是在发生变化时不会重新加载?
  • @MichałSzydłowski 我会尝试删除用户参考。

标签: node.js docker docker-compose nodemon


【解决方案1】:

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) 获取当前工作目录的值

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      试试吧! 这对我有用:

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

      【讨论】:

      • 天哪...我的代码是对的!而我只是错过了那面旗帜。
      【解决方案4】:

      我继续创建了一个示例容器和 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"
        }
      }
      

      Dockerfile:

      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 RUN 如果您正在使用 DOCKER COMPOSE,请跳过(如果您是,请转到下面的第 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在修改后成功重启!



      【讨论】:

      • Uau 非常感谢您的指导!!下班回来我会试试的
      • 对你的例子的一个想法是我需要使用 docker-compose 来实现。
      • @MarcosDiPaolo 我的错...我继续并添加了一个步骤,概述了如何使用docker-compose 完成此操作...我还使用 .yml 文件更新了 GitHub 存储库...干杯!!
      • 是否需要通过docker exec更改文件?或者您可以正常通过 VSCode 对其进行编码并反映更改吗?
      • 嗨。感谢@MattOestreich 的回答。你能概述一下你所做的改变是什么吗?我正在比较方程式文件,引起我注意的是 Dockefile 中的“node:slim”和“apt-get”。这些命令中是否有任何产生影响的命令?
      【解决方案5】:

      好的 非常感谢 MattOestreich 的回答。
      现在我开始工作了,我不知道它是什么,我确实按照您的设置进行了操作,但是我当然使用的是 docker-compose,并且我还从中删除了一些东西。我也不再调用 mongo image,因为我在 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"
        }
      }
      
      

      再次感谢马特,我希望这个帖子可以帮助像我这样有需要的人。

      【讨论】:

        猜你喜欢
        • 2021-03-04
        • 2021-10-21
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 2020-06-23
        • 2019-09-11
        • 2014-09-24
        • 2017-05-10
        相关资源
        最近更新 更多