Я использую watchdog , чтобы отслеживать каталог файлов на наличие событий файловой системы.Если этот скрипт watcher обнаруживает событие, я хочу сделать запись в базе данных (в данном случае Mongodb).Файловая система, которую нужно наблюдать, на самом деле является томом Docker, связывающим свою файловую систему с хост-компьютером.Весь код выполняется в контейнерах Docker.Я могу присоединиться к любому из контейнеров в системе и использовать pymongo, чтобы правильно добавить запись в БД.
Я также могу запустить watcher на хост-компьютере, и все работает должным образом (в том числе и в том случае, если действует изменение в файловой системе из связанной файловой системы в контейнере.
Однако, когда я запускаю код наблюдателя в контейнере, методы в обработчике событий, запускаемые событиями файловой системы, кажется, никогда не вызываются. Конечно, не создаются записи в БД.
Существует 3 источника кода:
Каталог наблюдателя 'watcher', включая наблюдателя и обработчик [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 [модуль data_persist]
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()
Я использую 3 источника кода в одном и том же контейнере Docker, 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"
Почему часы?События обработчика hdog не вызываются?