在Docker容器中使用inotifywait无法注册更改

15

我有一个脚本在docker容器内运行,通过inotifywait监听目录的变化。该目录通过docker -v挂载到主机系统上。

由于某些原因,当此目录中的文件发生更改时,inotifywait不会触发。

这是有问题的脚本行。

inotifywait -e create -e modify -e delete -e move  /etc/nginx/sites-enabled

容器是这样启动的(通过 fig)

web:
  build: .
  ports:
   - "80:80"
  volumes:
   - ./conf:/etc/nginx/sites-enabled
当我通过fig up启动设置时,脚本被执行,但是挂载卷中的更改不会触发inotify障碍。

我使用了一个基本的容器,安装了inotify-tools,启动了inotify,创建了一个目录和一个文件,并得到了通知。因此,这似乎与docker -v中的卷有关。 - user2915097
Docker不等同于虚拟化,也许这是一个边缘情况,Docker无法保持隔离。 - Johannes Reuter
我使用使用 docker compose(fig)和通过 docker -v 创建的卷时也看到了相同的行为。 - Leigh McCulloch
五年过去了,这个问题在使用 Docker Edge、WSL2、Linux 容器和挂载卷时仍然存在... 无法进行带有热模块替换的 React 开发。 - UmaN
1个回答

1
您需要像这样在脚本中添加 -mq:

inotifywait -mq -e create -e modify -e delete -e move  /etc/nginx/sites-enabled

我已测试此解决方案,它有效。"m"代表"监视","q"代表安静。

这取决于你想要什么,如果你希望在发生更改后停止inotifywait的监视,则不需要-m选项。因此,例如,如果您有一个像下面这样的脚本:inotifywait <directory> && echo "Change detected"您不需要-m选项,因为它将永远等待,永远无法到达echo语句。 - Floris Groenendijk

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