gpt4 book ai didi

docker - 在 docker 挂载的卷上进行 inotify (Mac/Linux)

转载 作者:行者123 更新时间:2023-12-05 02:36:56 27 4
gpt4 key购买 nike

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

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

docker 文件

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

主程序

#!/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 文件已创建,其中包含从容器 shell 中启动的 watchfolder 中的任何操作的行。但如果操作是从主机在此安装的卷上执行的,则不是

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

最佳答案

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

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

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

根据 docker 文档,osxfs events are reported

Most inotify events are supported in bind mounts... This means that file >system events from macOS are sent into containers and trigger any listening >processes there.

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

关于docker - 在 docker 挂载的卷上进行 inotify (Mac/Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70117645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com