使用Docker进行node开发时实现热加载功能

 更新时间:2024年09月29日 10:36:23   作者:冷夜星光  
这篇文章主要介绍了使用docker进行vue、react或者node开发时实现热加载功能,即宿主机文件修改之后实时刷新或者实时重启服务,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下

说明:使用docker进行vue、react或者node开发时实现热加载功能,即宿主机文件修改之后实时刷新或者实时重启服务。

不使用docker

本地开发node程序的时候只需要配置 nodemon 启动就可以了,例如
假设你有一个简单的 Node.js 文件,名为 app.js,内容如下:

const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content - Type': 'text/plain'});
    res.end('Hello, World!\n');
});

server.listen(3000, () => {
    console.log('Server running on port 3000');
});

然后只需要运行以下命令

npm install -g nodemon
nodemon app.js

此时,当你修改 app.js 文件内容之后,nodemon 就会检测到文件变化并自动重启服务器,刷新页面之后你就能立即看到修改后的效果。

使用docker

docker版本为 Docker version 27.1.1, build 6312585 ,且已经配置好 dockerfile 文件的基础之上。实现本地文件与容器内文件的同步有多种方法。在这儿只介绍在compose.yaml配置的两种方法,分别是:

1. 使用 watch 同步配置(推荐):

services:
  server:
    build:
      context: .
    ports:
      - 3000:3000
    develop:
      watch:
        - path: ./package.json  # 监听当前目录下的package.json文件
          action: rebuild  # package.json文件变化时docker会重新构建,与docker compose up --build等效
        - path: .   # 监听当前目录
          target: /usr/src/app  # 容器中的目标路径,将宿主机的当前目录与容器内的/usr/src/app路径相关联
          ignore:   # 忽视的文件
            - node_modules/
          action: sync # 同步动作,docker会确保对主机上文件所做的任何更改自动与服务容器内的相应文件相匹配。
    command: nodemon app.js

请仔细看注释,此时只需要运行 docker compose up --watch 命令即可实现热更新。 更多配置请前往官方文档查看

2. 使用Bind Mounts绑定挂载(容器文件更改会同步到宿主机):

services:
  server:
    build:
      context: .
    ports:
      - 3000:3000
    volumes:
      - .:/usr/src/app  # 绑定挂载宿主机当前目录到容器
      - /usr/src/app/node_modules   # 创建一个匿名卷用于存储容器的node_modules,防止本地 node_modules目录覆盖容器中的依赖。
    command: nodemon --legacy-watch --polling-interval 1000 app.js  # 此处命令与上面不一致

请仔细看注释,使用该配置运行 docker compose up 命令也能实现热更新。

注意:

相信你也注意到了command命令和上面的 不一致,这是因为直接运行 nodemon app.js 在windows下会出现热加载失效的情况。具体现象是在容器内修改文件时,nodemon 能够正确检测到更改并热加载应用;但在宿主机修改文件时,尽管文件已经同步到容器内,nodemon 却未能检测到这些更改,从而无法触发热加载。

原因: 在 Docker 环境中,尤其是在 macOS 和 Windows 上,由于底层文件系统的差异,文件系统事件(如 inotify 事件)可能无法正确地从宿主机传递到容器。这导致 nodemon 无法检测到宿主机上的文件更改。因此,尽管文件已同步到容器内,nodemon 依然未能触发热加载。

解决方案: 配置 nodemon 使用轮询,也就是 nodemon --legacy-watch --polling-interval 1000 app.js 命令实现热加载功能。不过需要注意的是相较于默认模式,轮询模式会消耗更多的 CPU 和 I/O 资源,尤其是在大规模项目或频繁文件变更的时候。另外也可以尝试使用 docker-syncmutagen 等工具来解决这个问题,不过我没试过。

总结

1.使用 watch 同步配置

优点

  • 高级同步策略:可以针对特定文件或目录设置不同的同步策略,例如仅在某些文件更改时触发重建。
  • 自动化流程:结合自动重建和同步,提升开发效率,减少手动操作。
  • 灵活性:可以根据项目需求定制同步和重建的行为,适应复杂的开发流程。

缺点

  • 维护成本:配置可能需要更多的维护,尤其是在团队协作或项目规模扩大时。

适用场景

  • 大多数项目:适用于大多数项目,个人强烈推荐。

2.使用Bind Mounts绑定挂载

优点

  • 实时同步:任何在宿主机上更改会立即在容器内生效,反之亦然。
  • 简单直观:配置简单,直接映射宿主机目录到容器目录。

缺点

  • 性能问题:在某些操作系统(如 macOS 和 Windows)上,绑定挂载的性能可能较差,尤其是在大量文件操作时。另外在windows下文件系统事件可能无法及时传递。
  • 路径依赖:绑定挂载路径依赖于宿主机的文件系统结构,可能影响跨平台的可移植性。
  • 权限管理:需要确保宿主机和容器内的文件权限一致,避免权限冲突问题。

适用场景

  • 开发环境:需要频繁修改代码并希望这些更改即时反映到运行中的容器中。
  • 简单项目:项目结构简单,不需要复杂的文件同步策略。

以上就是使用Docker进行node开发时实现热加载功能的详细内容,更多关于Docker node热加载的资料请关注脚本之家其它相关文章!

相关文章

  • Docker daemon 配置和故障排除过程

    Docker daemon 配置和故障排除过程

    这篇文章主要介绍了Docker daemon 配置和故障排除过程,具有很的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Docker容器应用中,10个要不得的坏习惯

    Docker容器应用中,10个要不得的坏习惯

    这篇文章主要介绍了Docker容器的应用中,10个要不得的坏习惯,帮助大家更好的理解和使用docker,感兴趣的朋友可以了解下
    2020-08-08
  • 删除Docker镜像、容器和卷的教程指南

    删除Docker镜像、容器和卷的教程指南

    Docker 可以轻松地将应用程序和服务封装在容器中,以便在任何地方运行,然而,在使用 Docker 的过程中,很容易积累大量未使用的镜像、容器和数据卷,这些会使输出杂乱,并占用磁盘空间,所以本文给大家介绍了如何删除Docker镜像、容器和卷,需要的朋友可以参考下
    2024-10-10
  • Docker利用busybox创建基础镜像(base image)

    Docker利用busybox创建基础镜像(base image)

    今天小编就为大家分享一篇关于Docker利用busybox创建基础镜像(base image),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 使用ssh连接docker服务器的方法

    使用ssh连接docker服务器的方法

    这篇文章主要介绍了使用ssh连接docker服务器的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • docker容器间互相访问(docker bridge网络)

    docker容器间互相访问(docker bridge网络)

    本文主要介绍了docker容器间互相访问(docker bridge网络),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 通过Docker创建CentOS容器的实现步骤

    通过Docker创建CentOS容器的实现步骤

    本文主要介绍了Docker创建CentOS容器,使用文内的脚本可以快速创建CentOS 7.8虚拟系统集群,并通过SSH(Secure Shell)远程工具连接,感兴趣的可以了解一下
    2021-11-11
  • docker容器内网络请求缓慢问题解决

    docker容器内网络请求缓慢问题解决

    在使用docker的过程中发现了几个问题,在docker里进行的网络请求经常会失败,这篇文章主要介绍了docker容器内网络请求缓慢问题解决
    2019-01-01
  • docker部署nginx并且实现https的方法步骤

    docker部署nginx并且实现https的方法步骤

    启用HTTPS可以提高网站的安全性、可信度,同时符合法规要求,本文主要介绍了docker部署nginx并且实现https的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Docker目录迁移的详细执行步骤(按脚本流程)

    Docker目录迁移的详细执行步骤(按脚本流程)

    我们在生产环境中安装Docker时,默认的安装目录是 /var/lib/docker,而通常情况下,规划给系统盘的目录一般为50G,该目录是比较小的,一旦容器过多或容器日志过多,就可能出现Docker无法运行的情况,所以我们进行Docker目录迁移,本文给大家介绍了Docker目录迁移的详细步骤
    2025-07-07

最新评论