将 nodemon 与 docker 和 docker-compose 一起使用

Posted

技术标签:

【中文标题】将 nodemon 与 docker 和 docker-compose 一起使用【英文标题】:Use nodemon with docker and docker-compose 【发布时间】:2019-12-25 16:36:07 【问题描述】:

我将 nodemon 与 docker-compose 一起使用。 这是我的 Dockerfile:

FROM node:10

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]

我的 docker-compose.yml

version: '3'
services:
  app:
    build: .
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    container_name: docker-node-mongo
    restart: always
    ports:
      - 3000:3000
      - 9229:9229
    command: npm start
    links:
      - mongo
      - redis
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - "27017:27017"
  redis:
    image: redis:alpine
    volumes:
      - /var/redis/data:/data    

还有我的 package.json 脚本:


  "scripts": 
    "start": "nodemon --inspect=0.0.0.0 index.js"
  


根据我工作的 docker 容器内的代码,我的代码正在更新,但我没有任何重新加载。

【问题讨论】:

你可以通过 ssh 进入容器并检查你的 package.json 吗? @federkun "name": "docker-node-mongo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": "start": "nodemon --inspect=0.0.0.0 index.js" , "keywords": [], "author": "", "license": "ISC", "dependencies": "bluebird": "^3.5.5", "body-parser": "^1.18.3", "ejs": "^2.6.1", "express": "^4.16.3", "mongoose": "^5.2.7", "nodemon": "^1.19.1", "redis": "^2.8.0" 您必须在您的 dockerfile 中添加 nodemon 作为全局变量,即 run npm install -g nodemon @Intellidroid FROM node:10 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g nodemon RUN npm install COPY . . CMD ["npm", "start"] 如果你是这个意思,它就行不通了。 您是否在重新启动 docker-compose 时进行了重建? docker-compose up --build 【参考方案1】:

重启时带有inspect 的nodemon 的问题。您可以阅读更多关于问题here 的信息。您可以尝试 nodemon 团队提到的解决方法

"inspect": "kill-port --port 9229 && node --inspect=0.0.0.0:9229 build/startup.js",
"start_watch_inspect": "nodemon --delay 80ms --watch build/ build/startup.js --exec 'npm run inspect'",

如果您可以在不检查的情况下进行管理,则可以使用以下命令使其工作

"scripts": 
    "start": "nodemon index.js"
  

这将适用于挂载目录 docker run --rm -v /home/myapp:/root --name test -it testnode

将代码复制到容器内的 docker build 和更新文件也可以正常工作。

【讨论】:

【参考方案2】:

如果您使用-L--legacy-watch 标志启动nodemon,它会在检测到更改时正确重新启动。 package.json 文件中的脚本是:


  "scripts": 
    "start": "nodemon -L --inspect=0.0.0.0 index.js"
  

我遇到了这个解决方案作为对这个要点的评论: https://gist.github.com/ksmithut/e126f7ddb40b760487a17e8b569a77b5#gistcomment-2725750

这可以在https://github.com/remy/nodemon#application-isnt-restarting的官方文档中找到

【讨论】:

以上是关于将 nodemon 与 docker 和 docker-compose 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Docke连载:第三章:Docker的使用

nodemon 不使用 docker 充值

Webstorm- Nodemon + Typescript + Docker - 调试器已连接但断点不起作用

Nodemon 在 Windows Docker 环境中不重启

文件更改时,两个带有 Nodemon 的后端服务器不会在 docker 容器中重新加载

Nodemon 无法在 Docker 上使用 package.json 中的 npm 脚本