Node.js Docker容器未更新卷中的更改。

7

我正在尝试在我的Windows电脑上托管一个开发环境,其中包含前端和后端容器。到目前为止,我只在后端工作。所有文件都在C驱动器上,通过Docker Desktop共享。

我有以下docker-compose文件和Dockerfile,后者位于根目录下名为backend的目录中。

Dockerfile:

FROM node:12.15.0-alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

EXPOSE 5000

CMD [ "npm", "start" ]

docker-compose.yml:

version: "3"
services:
  backend:
    container_name: backend
    build:
        context: ./backend
        dockerfile: Dockerfile
    volumes:
      - ./backend:/usr/app
    environment:
      - APP_PORT=80
    ports:
      - '5000:5000'

  client:
    container_name: client
    build:
      context: ./client
      dockerfile: Dockerfile
    volumes:
      - ./client:/app
    ports:
      - '80:8080'

由于某种原因,当我在本地文件中进行更改时,这些更改没有反映到容器内。我通过轻微修改其中一个文件的输出来测试此功能,但每次都需要重建容器才能看到更改生效。
我之前在PHP应用程序中使用Docker,并基本上做了相同的事情。因此,我不确定为什么我的Node.js应用程序不能正常工作。我想知道是否有明显的遗漏导致此功能无法正常工作。
任何帮助将不胜感激。

你确定你已经在正在运行的容器内重启了Node.js进程吗? - zoonman
我对使用Node还很陌生。为什么需要这样做呢?我在PHP中从未遇到过这种情况。这就是nodemon发挥作用的地方吗? - James Pavett
你正在寻找nodemon。 - tlt
1个回答

7
这里node和PHP的区别是,PHP会自动在请求之间获取文件系统的更改,但是node服务器不会。如果通过docker-compose down然后up重新启动node(不需要重建!),你会发现文件更改已经被识别出来了。
如果想让node在不需要重新启动服务器的情况下捕获文件系统的变化,可以使用一些node工具。其中之一是nodemon: https://www.npmjs.com/package/nodemon。按照本地安装的说明进行安装,并更新启动脚本以使用nodemon而不是node。
此外,我认为你的dockerfile中有一个错误,你需要将源代码复制到工作目录中。我假设你最初的配方来自于这里:https://dev.to/alex_barashkov/using-docker-for-nodejs-in-development-and-production-3cgp。下面是docker file。你漏掉了一步!
FROM node:10-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

CMD [ "npm", "start" ]

谢谢这个建议,我尝试安装nodemon,就像上面的评论所建议的那样。唯一的问题是,如果我在服务器上运行bash,那么在Windows上进行的文件更改甚至都没有被接收到。如果我直接在容器中进行更改,那么nodemon会重新启动应用程序。因此,感觉docker仍然无法正确更新文件。 - James Pavett
1
@RobertMoskal 太好了,nodemon和COPY解决了那个问题,并让我更清楚地了解了一切的工作原理。 - James Pavett
nodemon --legacy-watch在您运行命令时使用此注释 - Nay Oo Kyaw
https://dev59.com/GV4d5IYBdhLWcg3wDvC0 - Nay Oo Kyaw
https://dev59.com/GV4d5IYBdhLWcg3wDvC0 - Nay Oo Kyaw
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接