【问题标题】:inotify on docker mounted volumes (Mac / Linux)在 docker 挂载的卷上进行 inotify (Mac / Linux)
【发布时间】:2022-01-04 02:46:37
【问题描述】:

我已经搜索了几个小时,似乎找不到这个问题的最新答案

问题:显然,MacOS 上的 Docker 正在使用 VirtualBox,它不想将文件通知从主机操作系统传递到容器。因此,inotifywait 只会在被监视文件夹中的文件活动在容器内执行时通知这些活动。不是从主机执行这些操作时。

Dockerfile

FROM python:3.9.6
COPY main.sh /bin/main.sh
RUN chmod +x /bin/main.sh
RUN apt-get update -y
RUN apt-get install -y inotify-tools
CMD /bin/main.sh

main.sh

#!/usr/bin/env bash

inotifywait -mq -r -e create -e modify -e delete -e move /data |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'" >> log.txt
    done

构建容器

docker build -f Dockerfile -t my_container .

运行容器

docker run -it -v /someHOSTdirectory/data:/data my_container my_container

log.txt 文件已创建,其中包含从容器外壳内启动的监视文件夹中的任何操作的行。但如果该操作是从主机对此安装的卷执行的,则不会

我正在使用 python 基础映像,因为我有一个 python 脚本,我想在该监视文件夹或其子目录中的任何新文件上运行该脚本。这个 docker 容器将在我的 debian 服务器上运行,但我在 mac 上开发。

【问题讨论】:

  • 你能否设置一个 HTTP 监听器(可能使用 Flask)并使用 HTTP POST 请求将文件发送到进程,而不是依赖文件系统事件?
  • @大卫迷宫。感谢您的建议。我不确定这是否会起作用,因为我没有设置任何类似的东西。但是根据您的解释,我想知道这是否对我有用,因为这些文件不会通过 POST 进入,它们将被手动移动到监视文件夹中

标签: docker inotify docker-for-mac inotifywait


【解决方案1】:

经过 2 天的摆弄,我发现了这个解决方案。

在 docker for mac 中,转到首选项 > 常规 > 使用 gRPC FUSE 进行文件共享 [关闭此功能 - 默认情况下启用]。

除了勾选此项之外,我还小心地在卷挂载上使用了正确的大小写(例如 -v user/data:/data 不正确,应该是 -v User/data:/data)

根据 docker 文档,osxfs events are reported

绑定挂载支持大多数 inotify 事件...这意味着来自 macOS 的文件 >系统事件被发送到容器中并触发那里的任何侦听 >进程。

因此,在这两项更改之后,即使事件是从主机操作系统执行的,我也能够让 inotifywait 记录对挂载中监视文件夹所做的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 2016-12-15
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多