当文件更改时,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
文件
cd /path/to/dir/that/has/your/compose/file
docker-compose up -d
第 2 步:验证应用程序是否正常工作
第 3 步:检查容器日志,以获得基线
docker logs nodemon-test
第 4 步: 我已经包含了一个 bash
脚本来尽可能简单地编辑文件。我们需要在容器上弹出一个 shell,运行 bash
脚本 (change.sh
)
docker exec -it nodemon-test /bin/bash
bash change.sh
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) 获取当前工作目录的值
我读了很多关于这个的帖子,但没有人解决任何问题。
有人说您必须在 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
文件
cd /path/to/dir/that/has/your/compose/file
docker-compose up -d
第 2 步:验证应用程序是否正常工作
第 3 步:检查容器日志,以获得基线
docker logs nodemon-test
第 4 步: 我已经包含了一个 bash
脚本来尽可能简单地编辑文件。我们需要在容器上弹出一个 shell,运行 bash
脚本 (change.sh
)
docker exec -it nodemon-test /bin/bash
bash change.sh
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) 获取当前工作目录的值