文件更改时,Nodemon不会重新加载到Docker容器中

时间:2019-09-15 16:32:44

标签: node.js docker docker-compose nodemon

我读过很多关于此的主题,但是没人能解决任何问题。

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

到目前为止,这里是我的配置:

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

如果有人对此有确定性,请提供帮助。谢谢!!!

4 个答案:

答案 0 :(得分:1)

我继续创建了一个示例容器和存储库,以说明如何实现此目标。

只需遵循以下步骤,概述了如何在nodemon容器内使用Docker


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运行:如果您正在使用DOCKER COMPOSE,请跳过(如果要,请转到下面的步骤1)下拉示例Docker容器

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

enter image description here


步骤1 使用文档编辑器

有关配置,请参见上面的docker-compose.yml文件

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

enter image description here


第2步:验证应用是否正常

http://localhost:1337

enter image description here


步骤3:检查容器日志,以获取基线

docker logs nodemon-test

enter image description here


第4步:我提供了一个bash脚本,以使编辑文件尽可能简单。我们需要在容器上弹出一个外壳,然后运行bash脚本(change.sh

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

  2. bash change.sh

  3. exit

enter image description here


第5步:再次检查日志以确认所做的更改以及nodemon已重新启动

docker logs nodemon-test

enter image description here



从上一个屏幕截图中可以看到,nodemon在进行更改后已成功重新启动!



答案 1 :(得分:1)

好的 非常感谢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"
  }
}

再次感谢Matt,我希望这个话题能帮助像我这样有需要的人。

答案 2 :(得分:1)

尝试一下! 这对我有用:

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

答案 3 :(得分:0)

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