docker 中的 Nodemon 不起作用,而且 --legacy-watch -L 也不起作用

问题描述 投票:0回答:3

我花了很长时间试图找到解决方案 - 在更新例如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
3个回答
0
投票

如果我没记错的话,docker 容器就是为了在进程结束时杀死自己而设计的。当使用nodemon(并更新代码)时,进程将停止并重新启动,容器将

stop
。你可以让 npm start 不成为主进程,但这不是
good practice


0
投票

可能已经晚了。但我会写。

您的配置存在误解。

  1. 指挥

    "start:legacy"
    。您应该仅使用一个选项来运行旧版
    --legacy-watch
    -L
    ,而不是同时运行两者。因为这些命令是相等的。根据nodemon文档:通过CLI,使用--legacy-watch或简称-L

  2. 您的

    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
,您将能够在本地进行更改,容器也将看到更改


0
投票

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"
  }
}
上述解决方案对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.