ウォッチドッグを使用して、ファイル システム イベントのファイル ディレクトリを監視しています。このウォッチャースクリプトがイベントを検出した場合、データベース (この場合は Mongodb) にエントリを作成します。監視対象のファイル システムは、実際には、そのファイル システムをホスト PC にリンクする Docker ボリュームです。すべてのコードは Docker コンテナーで実行されます。システム内の任意のコンテナにアタッチし、pymongo を使用してデータベースにエントリを正しく追加できます。
ホスト マシンでウォッチャーを実行することもでき、すべてが期待どおりに動作します (コンテナー内のリンクされたファイル システムからファイル システムに変更があった場合に期待どおりに動作することを含みます)。
ただし、コンテナーでウォッチャー コードを実行すると、ファイルシステム イベントによってトリガーされるイベント ハンドラーのメソッドが呼び出されないようです。確かに、作成された db エントリはありません。
コードには 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()
同じ 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"
ウォッチドッグ ハンドラー イベントが呼び出されないのはなぜですか?