You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Python Watchdog无法监听Docker卷中新文件的问题?

Docker容器中Watchdog无法检测挂载卷新文件的解决方案

问题详情

我有一个Python脚本,使用watchdog包监听本地目录的新文件并上传至远程服务器,本地运行正常。部署到Docker容器后,挂载volume中的新文件无法被检测到。已尝试修改Observer的path参数为容器内挂载路径(/data),但未生效,脚本完全检测不到任何新文件。

相关代码

文件监听Handler

class NewFileHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return
        file_path = event.src_path
        file_name = os.path.basename(file_path)
        upload_file(file_path, file_name)

Observer初始化代码

if args.watch_new == 'True':
    print(f"Waiting for new files in directory {directory}...")
    sys.stdout.flush()

    event_handler = NewFileHandler()
    observer = Observer()
    observer.schedule(event_handler, directory, recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
            sys.stdout.flush()
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Docker挂载配置(docker-compose.yml)

volumes:
  - "${DIRECTORY}:/data"

解决方法

  • 切换到PollingObserver后端:默认的Observer依赖inotify机制,但部分挂载卷(如NFS、Windows共享目录)不支持inotify。改用PollingObserver通过轮询检测,兼容性更强:
from watchdog.observers.polling import PollingObserver

# 替换原Observer实例化代码
observer = PollingObserver()
  • 验证挂载路径与权限:进入容器执行echo $directory确认路径为/data,同时检查该目录的读写权限。可在Dockerfile中添加权限配置:
RUN chown -R appuser:appuser /data
  • 添加调试日志:在on_created方法中增加日志输出,确认事件是否被触发:
def on_created(self, event):
    print(f"Event detected: {event.src_path}, type: {'directory' if event.is_directory else 'file'}")
    sys.stdout.flush()
    if event.is_directory:
        return
    # 原有上传逻辑...
  • 确认文件写入完整性:如果从宿主机向挂载目录拷贝文件,需确保文件完全写入后再进行检测,避免因文件未写完导致的事件异常。

内容的提问来源于stack exchange,提问作者miahela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:57:06