Docker 即使设置了 -L,Nodemon 也不会重新加载更改

Docker Nodemon not reloading on changes even though -L is set

您好,我正在尝试 docker调整我目前正在使用的应用程序。它使用 nodejs 和 mariadb。我在弄清楚如何使 nodemon 工作时遇到了一些困难。

我尝试使用 --legacy-watch 或 -L 的缩写形式,但它并没有改变结果。

NPM 安装了所有依赖项,我什至得到了 nodemon 文本,但是当我进行更改时它不会重新启动服务器。

如果有人能帮忙就太好了

package.json:

{
  "name": "nodejs_mariadb_docker_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node src/index.js",
    "dev": "nodemon -L src/index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.2",
    "mariadb": "^2.5.5",
    "nodemon": "^2.0.15"
  }
}

nodejs 的 Dockerfile:

# Specifies the image of your engine
FROM node:16.13.2

# The working directory inside your container
WORKDIR /app

# Get the package.json first to install dependencies
COPY package.json /app

# This will install those dependencies
RUN npm install

# Copy the rest of the app to the working directory
COPY . /app

# Run the container
CMD ["npm", "run", "dev"]

和 docker 撰写文件:

version: "3"
services: 
  node:
    build: .
    container_name: express-api
    ports:
      - "80:8000"
    depends_on: 
      - mysql

  mysql:
    image: mariadb:latest
    ports:
      - "3306:3306"
    environment: 
      MYSQL_ROOT_PASSWORD: "password"
    volumes:
      - mysqldata:/var/lib/mysql
      - ./mysql-dump:/docker-entrypoint-initdb.d
volumes:
    mysqldata: {}

所以明显的问题是您没有将代码挂载到容器中。这就是为什么 nodemon 看不到任何变化并对它们做出反应的原因。

此外,在本地开发应用程序可能更直接,并且仅使用 docker 作为 package/ship 的手段。

如果你还想走这条路,我建议你这样。

services: 
  express-api:
    build: ./
    # overwrite the prod command
    command: npm run dev
    ports:
      - "80:8000"
    volumes:
      # mount your code folder into the app folder
      - .:/app

# mysql stuff ...

在您的 docker 文件中,您可以将命令替换为生产命令,因为在开发中,compose 会覆盖它。

FROM node:16.13.2
WORKDIR /app
COPY package.json package-lock.json ./
# use ci to install from the lock file, 
# to avoid suprises in prod
RUN npm ci
COPY . ./
# use the prod command
CMD ["npm", "run", "start"]

这会在开发中做一些多余的工作,比如复制代码,但应该没问题。

此外,您可能希望使用 .dockerignore 来忽略 mysqldump 等。否则,它会被复制到图像中,这可能是不可取的。

另请注意,通过 您的依赖项已被锁定,并且不会自动更新。如果您的锁定文件与 package.json 不同步,它也会抛出错误。这就是您想要的生产。如果你在本地开发,你可以在本地 运行 npm install 或通过 docker exec 来增加依赖项,如果需要的话。然后你可以检查是否没有任何问题,并确保你的产品图像会很好,因为它再次从锁定文件中使用。