Сторожевой наблюдатель не работает в контейнере - PullRequest
0 голосов
/ 24 апреля 2018

Я использую watchdog , чтобы отслеживать каталог файлов на наличие событий файловой системы.Если этот скрипт watcher обнаруживает событие, я хочу сделать запись в базе данных (в данном случае Mongodb).Файловая система, которую нужно наблюдать, на самом деле является томом Docker, связывающим свою файловую систему с хост-компьютером.Весь код выполняется в контейнерах Docker.Я могу присоединиться к любому из контейнеров в системе и использовать pymongo, чтобы правильно добавить запись в БД.

Я также могу запустить watcher на хост-компьютере, и все работает должным образом (в том числе и в том случае, если действует изменение в файловой системе из связанной файловой системы в контейнере.

Однако, когда я запускаю код наблюдателя в контейнере, методы в обработчике событий, запускаемые событиями файловой системы, кажется, никогда не вызываются. Конечно, не создаются записи в БД.

Существует 3 источника кода:

  1. Каталог наблюдателя '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'})
    
  2. Класс, используемый для записи в 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)
    
  3. Скрипт, запускающий наблюдателя [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 не вызываются?

1 Ответ

0 голосов
/ 26 апреля 2018

Кажется, что источник моей проблемы лежит не в моем коде, а Docker для Windows не уведомляет контейнер о любых изменениях файлов, которые вы делаете из Windows .Это означает, что ему видны только изменения, внесенные в том из контейнера.

Я нашел обходной путь здесь , хотя для этого требуется, чтобы каталог хоста непрерывно выполнял скрипт.Не идеально, но, по крайней мере, не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...