【问题标题】:NodeJS is not detecting change in Docker Bind Mount until Swarm is restarted在重新启动 Swarm 之前,NodeJS 不会检测 Docker Bind Mount 中的更改
【发布时间】:2020-02-13 09:45:50
【问题描述】:

我正在 Docker 上以 Swarm 模式(单节点)构建 NodeJS 应用程序。我正在为 NodeJS 源代码使用绑定挂载卷。一切运行完美,我可以在 localhost 中看到 NodeJS 和 Express 的输出,但是当我在 NodeJS 代码(位于绑定挂载卷中)中更改某些内容时,没有任何变化。我必须重新启动服务才能观察更改。早些时候,当我只使用 Docker Compose 时,它​​从未发生过,但现在当我切换到 Swarm 时,我遇到了问题。

我在 macOS 10.14.6 上使用 Docker 18 和 Visual Studio Code 1.39

Dockerfile

FROM node:12-alpine
WORKDIR /node-dir
COPY package*.json ./
RUN npm install

docker-compose.yml 文件

# Docker-compose.yml
version: '3.7'

services:

    node-service:

        image: node-img:1.0

        ports:
            - 80:3000
        working_dir: "/node-dir"

        volumes:
        - ./node-dir/source:/node-dir/source

        networks:
            - ness-net

        command: npm start

networks:

    ness-net:

我还读到这可能是由于 inode 造成的,大多数编辑器在保存文件时会断开链接。但它在 docker-compose 下使用 Visual Studio Code 正常工作,其行为仅在 Docker Swarm 中发生变化。

更新:我使用带有绑定挂载的 Nginx 提供了一个静态 html 文件,并且我可以使用 VS Code 轻松更改该文件并得到反映。它唯一没有检测到文件更改的 NodeJS。

【问题讨论】:

  • Swarm 是一个多主机容器管理系统;哪些主机有你的源代码,你如何得到它? (它应该将COPYd 放入映像中,而不是从可能有也可能没有它的主机绑定安装。)
  • 我在单节点上使用 Swarm。我目前处于开发模式,需要反复测试源代码,所以我想使用绑定挂载,让开发和测试更容易。
  • 这个问题绝对不在 docker swarm 模式方面。您可以轻松测试您是否可以动态编辑文件并使用为静态站点提供服务的简单 nginx 容器检查更改。所以我会专注于为什么 node 没有正确检测到更改。
  • 你说得对,我使用 Nginx 提供了一个静态文件,并尝试使用 Visual Studio Code 从后端进行更改及其反映。现在主要问题是为什么 Node 没有检测到变化。

标签: docker docker-compose dockerfile docker-swarm docker-volume


【解决方案1】:

如果您的卷映射正确,源代码更改应该会到达您的 node.js 应用容器。

在 docker 主机上进行更改后,您可以通过检查容器内的源代码来验证它。

我目前处于开发模式,我要测试源代码 反复所以我想使用绑定安装来进行开发和 测试更容易。

但是,在容器内的节点进程重新加载并获取更改之前,您的源代码更改不会生效。

为了实现这一点,您必须use nodemon。 Nodemon 将挑选源代码中的更改并随着更改重新加载节点进程。

另一种更长的替代方法是构建新的 docker 映像,然后使用以下命令更新您的应用:docker service update --image=...

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多