簡體   English   中英

文件更改時,Nodemon 不會在 docker 容器中重新加載

[英]Nodemon doesn't reload in docker container when files change

我閱讀了很多關於此的主題,但沒有人解決任何問題。

有人說您必須在nodemon命令中添加--legacy-watch (或-L )。 其他人顯示了幾種不同的配置,顯然 nodody 真的知道當 docker 容器內的卷中的文件更改時,您必須做什么才能實現服務器重啟。

到目前為止,我的配置是:

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

包.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運行命令,我相信還有很多我現在不記得了。 沒有。

如果有人對此有任何確定性,請提供幫助。 謝謝!!!!

嘗試一下! 這對我有用:

通過 CLI,使用--legacy-watch-L簡稱。 更多信息在這里

我繼續創建了一個示例容器和 repo 來展示如何實現這一點..

只需按照以下步驟操作,其中概述了如何在Docker容器內使用nodemon


Docker 容器:在 DockerHub

源代碼:在 GitHub


包.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 RUN如果您正在使用 DOCKER COMPOSE,請跳過(如果您使用,請轉到下面的第 1 步)下拉示例 docker 容器

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

在此處輸入圖片說明


第 1 步使用 Docker-COMPOSE

配置見上面docker-compose.yml文件

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

在此處輸入圖片說明


第 2 步:驗證應用程序是否有效

http://本地主機:1337

在此處輸入圖片說明


第 3 步:檢查容器日志,以獲取基線

docker logs nodemon-test

在此處輸入圖片說明


第 4 步:我包含了一個bash腳本,以使編輯文件盡可能簡單。 我們需要在容器上彈出一個 shell,然后運行bash腳本 ( change.sh )

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

  2. bash change.sh

  3. exit

在此處輸入圖片說明


第 5 步:再次檢查日志以驗證是否已進行更改並且nodemon重新啟動

docker logs nodemon-test

在此處輸入圖片說明



正如您在最后一個屏幕截圖中看到的那樣, nodemon更改后, nodemon成功重啟!



好的,非常感謝 MattOestreich 的回答。
現在我開始工作了,我不知道它是什么,我確實按照您的設置進行了操作,但當然我正在使用 docker-compose 並且我還從中刪除了一些東西。 我也不再調用 mongo 圖像,因為我在 Mongodb 圖集集群中設置了數據庫。 我的實際配置: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"

包.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"
  }
}

再次感謝馬特,我希望這個帖子能幫助像我這樣有需要的人。

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 = 工作目錄 /app
  • $(pwd) = PWD 是設置為當前工作目錄的變量。 所以 $(pwd) 獲取當前工作目錄的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM