我花了很长时间试图找到解决方案 - 在更新例如index.js的同时在docker中重新加载nodemon。我有 Windows 10。 我有 docker 的节点项目: proj/backend/src/index.js:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hello world.')
})
const port = process.env.PORT || 3001
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
proj/backend/package.json:
{
"scripts": {
"start": "node ./bin/www",
"start:legacy": "nodemon --legacy-watch -L --watch src src/index.js"
},
"dependencies": {
"express": "^4.17.2"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}
proj/backend/dev.Dockerfile:
FROM node:lts-alpine
RUN npm install --global nodemon
WORKDIR /usr/src/app
COPY . .
RUN npm ci
EXPOSE 3001
ENV DEBUG=playground:*
CMD npm run start:legacy
proj/docker-compose.dev.yml:
version: '3.8'
services:
backend:
image: backend-img
build:
context: ./backend
dockerfile: ./dev.Dockerfile
ports:
- 3001:3001
environment:
- PORT=3001
如果我没记错的话,docker 容器就是为了在进程结束时杀死自己而设计的。当使用nodemon(并更新代码)时,进程将停止并重新启动,容器将
stop
。你可以让 npm start 不成为主进程,但这不是 good practice
。
可能已经晚了。但我会写。
您的配置存在误解。
指挥
"start:legacy"
。您应该仅使用一个选项来运行旧版 --legacy-watch
或 -L
,而不是同时运行两者。因为这些命令是相等的。根据nodemon文档:通过CLI,使用--legacy-watch或简称-L
您的
Dockerfile
配置看起来不错。但是要将本地计算机文件和目录与 docker 容器同步,您应该在 docker-compose
中使用 volumes。因此,您的
docker-compose
文件将类似于:
version: '3.8'
services:
backend:
image: backend-img
build:
context: ./backend
dockerfile: ./dev.Dockerfile
volumes:
- ./your_project_dir:/usr/src/app
- /usr/src/app/node_modules
ports:
- 3001:3001
environment:
- PORT=3001
我相信,如果您定义
volumes
,您将能够在本地进行更改,容器也将看到更改
index.js
const express = require("express");
const PORT = 8080;
const HOST = "0.0.0.0";
const app = express();
app.get("/", (req, res) => {
res.send("Hello Sar Li Ram!");
});
app.listen(PORT, HOST, () => {
console.log(`Running on http://${HOST}:${PORT}`);
});
docker-compose.yml
version: '3.9'
services:
web:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/usr/src/app
ports:
- '3000:8080'
command: npm run dev
Dockerfile
FROM node:18
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
package.json
{
"name": "node-with-docker",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "nodemon server.js "
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2"
},
"devDependencies": {
"nodemon": "^3.0.2"
}
}