我正在使用看门狗监视文件系统事件的文件目录。如果此 Watcher 脚本检测事件,我想在数据库中进行条目(在本例中为mongoDB(。要观看的文件系统实际上是将其文件系统链接到主机PC的Docker卷。所有代码都在Docker容器中运行。我可以连接到系统中的任何容器上,并使用Pymongo正确添加DB的条目。
我也可以在主机机上运行 Watcher ,并且所有正常工作(包括如果从容器中的链接文件系统更改文件系统,则按预期行事。
。但是,当我在容器中运行观察器代码时,似乎从未调用过由文件系统事件触发的事件处理程序中的方法。当然没有创建DB条目。
有3个代码来源:
看门狗目录"观察者",包括观察者和处理程序 [watchdog_classes]
import time from watchdog.observers import Observer import watchdog.events as events from data_persist import persistance_interface db_interface= persistance_interface() class RepoWatcher: def __init__(self, dir_root='/targer_dir/'): print(dir_root) self.observer = Observer() self.dir_root = dir_root def run(self): event_handler = CustomEventHandler() self.observer.schedule(event_handler, self.dir_root, recursive=True) self.observer.start() try: while True: time.sleep(5) except KeyboardInterrupt: self.observer.stop() print("Shutting down...") self.observer.join() class CustomEventHandler(events.FileSystemEventHandler): @staticmethod def on_any_event(event): # Renamed files or dirs if isinstance(event, events.FileSystemMovedEvent): print("moved") db_interface.persist_one({'rename': 'renamed'}) # Created files or dirs elif event.event_type == 'created': print("created") db_interface.persist_one({'create': 'creation'}) # Deleted files or dirs elif isinstance(event, events.FileDeletedEvent): print("deleted") db_interface.persist_one({'deletion': 'deleted'})
用于写入MongoDB 的类
import pymongo from pymongo import MongoClient class persistance_interface(): def __init__(self): self.client = MongoClient('db', 27017) self.db = self.client.filesystemeventsdb self.filesystemevents_collection = self.db.filesystemevents_collection def persist_one(self, data): self.asset_collection.insert_one(data)
触发观察者的脚本 [watcher.py]
import watchdog_classes watcher = watchdog_classes.RepoWatcher() watcher.run()
我正在同一Docker容器中运行3个代码源,MongoDB在另一个容器中。
docker-compose.yaml看起来像这样:
version: '3'
services:
db:
image: tutum/mongodb
ports:
- "27017:27017"
environment:
- AUTH=no
entrypoint: "usr/bin/mongod"
sentry:
build: ./Docker/sentry
entrypoint: "python -u run_watcher.py"
volumes:
- "C:\Users\username\Desktop\HostVolume:/Container_Volume"
web:
build: ./Docker/site
ports:
- "8000:8000"
command: python -u manage.py runserver 0.0.0.0:8000
volumes:
- "C:\Users\username\Desktop\HostVolume:/Container_Volume"
为什么未调用看门狗处理程序事件?
看来,我的问题的来源不在我的代码中,而是Windows的 Docker不会将您从Windows 进行的任何文件更改通知容器。这意味着只能从容器内看到对音量的更改。
我在这里找到了一个解决方法,尽管它需要一个主机目录连续运行脚本。