docker 安装卷上的 inotify (Mac / Linux)

OSU*_*ian 6 inotify inotifywait docker docker-for-mac

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

问题:显然 VirtualBox 正在 MacOS 上由 Docker 使用,并且它不希望将文件通知从主机操作系统传递到容器。因此,当从容器内执行这些操作时,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
Run Code Online (Sandbox Code Playgroud)

主目录

#!/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
Run Code Online (Sandbox Code Playgroud)

构建容器

docker build -f Dockerfile -t my_container .
Run Code Online (Sandbox Code Playgroud)

运行容器

docker run -it -v /someHOSTdirectory/data:/data my_container my_container
Run Code Online (Sandbox Code Playgroud)

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

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

OSU*_*ian 4

经过两天的摆弄,我找到了这个解决方案。

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

除了检查这一点之外,我还小心地在卷安装上使用正确的大小写(例如 -v user/data:/data 不正确,应该是 -v User/data:/data)

根据docker文档,报告了osxfs事件

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

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