Grails 监视文件在 Vagrant 虚拟机内运行的 Docker 容器中不起作用

2024-03-06

我有一个相当嵌套的结构:

  1. MacOSX 工作站运行...
  2. Vagrant VirtualBox 虚拟机ubuntu/trusty64运行一个...
  3. Docker 容器正在运行...
  4. 我的应用程序是用 Grails 编写的

每层都以共享上一层文件系统的一部分的方式配置。这边走:

  • 流浪者,与config.vm.synced_folder指令中Vagrantfile
  • Docker,与-v命令如 switch 和VOLUME指令中的Dockerfile

这样我就可以在我的工作站上进行开发,并且底部的 Grails 应用程序应该(理想情况下)检测更改并动态重新编译/重新加载。当我直接在 MacOSX 上运行相同的应用程序时,这个功能曾经起作用,但现在 grails 似乎完全不知道文件更改。当然,如果我使用编辑器(在 Docker 容器内)打开文件,它们确实会发生更改,事实上,如果我停止/重新启动 grails 应用程序,则会使用新代码。

我不知道 grails 如何实现监视策略,但如果它依赖于某些操作系统级别的功能,我怀疑文件更改通知会在链中的某个位置丢失。

任何人都知道可能是什么原因和/或我如何调试这个?


有两种方法可以检测文件更改(据我所知):

Polling,这意味着以一定的时间间隔检查文件夹中所有文件的时间戳。达到“近乎即时”的变化检测需要非常短的时间间隔。这是 CPU 和磁盘密集型的。

操作系统事件(Linux 上为 inotify,OS X 上为 FSEvents),其中的更改是可检测的,因为文件操作会通过操作系统子系统。这对 CPU 和磁盘来说很容易。

网络文件系统 (NFS) 等不会生成事件。由于文件更改不会通过来宾操作系统子系统,因此操作系统不知道更改;仅操作系统making更改(OS X)知道它们。

Grails 和许多其他文件观察器工具依赖于 FSEvents 或 inotify(或类似)事件。

那么该怎么办?考虑到可能产生的流量,在正常情况下将 NFS 更改从主机“广播”到所有来宾是不切实际的。然而,我认为 VirtualBox 股票应该算作一个特殊的例外......

弥补这一差距的机制可能涉及一个监视主机变化并触发客户机同步的进程。

查看这些文章,了解一些有趣的想法和解决方案,涉及某种类型的 rsync 操作:

http://drunomics.com/en/blog/syncd-sync-changes-vagrant-box http://drunomics.com/en/blog/syncd-sync-changes-vagrant-box(Linux)https://github.com/ggreer/fsevents-tools https://github.com/ggreer/fsevents-tools (OS X)

Rsync 到来宾 (Docker) 实例上的非 NFS 文件夹具有 I/O 性能显着提高的额外优势。 VirtualBox 的股票速度慢得令人痛苦。

Update!

这就是我所做的。首次安装lsyncd(OS X 示例,更多信息位于http://kesar.es/tag/lsyncd/ http://kesar.es/tag/lsyncd/):

brew install lsyncd

在 Mac 上的 Vagrant 文件夹中,我创建了该文件lsyncd.lua:

settings {
    logfile = "./lsyncd.log",
    statusFile = "./lsyncd.status",
    nodaemon = true,
    pidfile = "./lsyncd.pid",
    inotifyMode = "CloseWrite or Modify",
}

sync {
    default.rsync,
    delay = 2,
    source = "./demo",
    target = "vagrant@localhost:~/demo",
    rsync = {
        binary   = "/usr/bin/rsync",
        protect_args = false,
        archive = true,
        compress = false,
        whole_file = false,
        rsh = "/usr/bin/ssh -p 2222 -o StrictHostKeyChecking=no"
    },
}

其作用是同步文件夹demo在我的 Vagrant 文件夹中到来宾操作系统中/home/vagrant/demo。请注意,您需要使用 SSH 密钥设置登录,以使此过程顺利进行。

然后,随着 vagrant VM 的运行,我启动了 lsyncd 进程。这-log Exec是可选的;它将其活动记录到标准输出:

sudo lsyncd lsyncd.lua -log Exec 

在 vagrant VM 上,我在同步文件夹中启动了 Grails (2.4.4):

cd /home/vagrant/demo
grails -reloading run-app

回到 Mac 上的 IntelliJ,我编辑了一个 Controller 类。它几乎立即触发了 lsyncd(2 秒延迟),之后我很快就确认 Grails 重新编译了该类!

总结一下:

  • 在 Mac 上编辑项目文件,在 VM 上执行
  • 使用 lsyncd 将更改同步到虚拟机内的文件夹
  • Grails 注意到更改并触发重新加载
  • 不使用 VirtualBox 共享,磁盘性能更快

Issues:Textmate 触发 lsyncd(尚)无法识别的 FSEvent 类型,因此不会检测到更改。不过,Vim 和 IntelliJ 都很好。

希望这对某人有帮助!我花了一天时间才弄清楚这些东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails 监视文件在 Vagrant 虚拟机内运行的 Docker 容器中不起作用 的相关文章

  • Laravel Homestead 中 npm 安装错误有解决方案吗?

    Windows 10 家园 虚拟盒6 0 8 流浪者2 2 5 节点 v12 5 0 npm v6 10 1 我想做的就是在新安装的 Laravel 应用程序中执行 npm install 命令 但我不断收到错误 经过两天的谷歌搜索并尝试了
  • 使用 tc 限制 Docker 容器的传出网络带宽

    我正在尝试对 Docker 容器进行带宽限制 为了限制下行带宽 我可以先找到容器的veth接口并使用tc tc qdisc add dev vethpair1 root tbf rate 1mbit latency 50ms burst 1
  • Grails + Spring Security:无法登录

    我刚刚开始学习Grails和Spring 我已经按照官方教程创建了一个登录系统 但我无法登录 用户名或密码不匹配 我知道 90 的情况下这是由于双重编码或多个数据源 这也导致双重编码 造成的 但我也没有这样做 class BootStrap
  • 仅在配置时才在 Vagrantfile 中运行代码

    我想在运行时在屏幕上显示一些文本vagrant up or vagrant provision etc 当且仅当正在配置 为了vagrant up它仅在第一次运行 或者如果特别强制 provision 如何才能做到这一点 添加 shell
  • 如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?

    我正在尝试使用调用我的 Lambda 函数sam local invoke但发现无法连接到我的主机MySQL 我尝试添加 docker network host但也无法连接 Traceback most recent call last F
  • 我需要启用哪些权限才能使 Docker 卷正常工作?

    假设我有一个保存一些数据的 Docker 容器 我希望这些数据能够持续存在 如果容器被停止 删除 升级等 我仍然希望数据位于主机操作系统文件系统上的可访问位置 目前 我的解决方案是创建一个目录 srv service name在我的主机上
  • 针对容器优化操作系统的 GCP 云监控

    我在用着GCP计算引擎 with 容器优化操作系统 我启用了Logging and 监控就那个例子而言 日志记录和监控具有写权限 但总是显示不适用于代理在监控仪表板中 If I SSH在我的实例中并运行docker images然后我看到输
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 连接被拒绝:当uwsgi和nginx在不同容器中时

    我正在尝试设置两个 docker 容器 是的 无需 docker compose 分开 一个带有 nginx 另一个带有带有基本 Flask 应用程序的 uwsgi 我在 docker 内的同一网络中运行容器我的 nginx 配置已添加 链
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 将主机中的空文件夹挂载到 Docker 中的非空文件夹

    我正在使用的工具是在 Docker 映像中提供的 由于安装该工具非常复杂 存在大量依赖项 因此我想使用 IDE 在主机上工作 但在容器上运行它 因此 下载并加载图像后 我运行 sudo docker run it v home myself
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • 如何从本地运行的docker容器访问Azure Keyvault?

    我有一个包含 ASP NET Core 应用程序的 docker 映像 该应用程序使用 Azure Key Vault 来访问连接字符串等内容 当我在本地运行图像时 出现以下错误 Unhandled Exception Microsoft
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • 我可以在没有 Hadoop 的情况下使用 Spark 作为开发环境吗?

    我对大数据和相关领域的概念非常陌生 如果我犯了一些错误或拼写错误 我很抱歉 我想了解阿帕奇火花 http spark apache org 并使用它仅在我的电脑中 在开发 测试环境中 由于Hadoop包含HDFS Hadoop分布式文件系统
  • Windows 上的 boot2docker 缺少 apt-get / 包管理器

    我在 boot2docker 中 我不确定我完全理解它 但它似乎是我正在进行的项目所需要的 我已经通过 ssh 登录了 并且尝试对我们的项目进行 make 但是我得到了 make not found 然后我尝试了一个 apt get ins
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • 如何物理删除未标记的 docker 镜像

    当我运行 sudo docker rmi me myimage 等命令时 我得到响应 image untagged 但是 当我重新运行 sudo docker images 时 我可以看到这个 untagged 图像仍然存在 并且 如果我运
  • 跨平台 C++ 文件系统观察器

    我正在寻找一个跨平台文件系统观察器 类似于文件系统观察者 http msdn microsoft com en us library system io filesystemwatcher aspx NET 中的类 因为它是守护进程 服务
  • 为什么我不能将 与 g++ 4.9.2 一起使用?

    我正在尝试使用文件系统 http en cppreference com w cpp experimental fs path 我有 std c 11 std c 1y in my CMakeLists txt 海湾合作委员会版本是4 9

随机推荐