node.js - 即使设置了 -L,Docker Nodemon 也不会在更改时重新加载

标签 node.js docker nodemon

嗨,我正在尝试对我当前正在使用的应用程序进行 dockerize。它使用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 无法看到任何更改并对它们使用react。

此外,在本地开发应用程序可能更直接,并且仅使用 docker 作为打包/发布它的方式。

如果你仍然想走这条路,我建议你这样做。

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 ...

在您的 dockerfile 中,您可以将命令替换为生产命令,因为在开发中,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。否则,它将被复制到图像中,这可能是不可取的。

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

关于node.js - 即使设置了 -L,Docker Nodemon 也不会在更改时重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70958923/

相关文章:

docker-compose:将 docker 镜像的端口暴露给主机

node.js - Nodeclipse + nodemon错误

javascript - Node.js 请求正文有一些额外的填充

javascript - 将来自对 REST API 的重复请求的最终 json 写入文件

node.js - 尝试将 Node.js 项目部署到 Google 应用引擎时出错

docker - 在私有(private)管道中设置 VSTS 代理的 docker 权限

javascript - 在 Nowjs 中传递带有回调参数的对象

postgresql - 无法连接到 AWS EC2 实例中的 Docker PostgreSQL 容器

node.js - 错误: Cannot find module 'C:\server.js' in Node server for Meanjs

node.js - nodemon 无法使用express v4 启动nodejs 应用程序