gpt4 book ai didi

python-3.x - 看门狗观察者不在容器中运行

转载 作者:行者123 更新时间:2023-12-02 18:15:07 25 4
gpt4 key购买 nike

我正在使用 watchdog监视文件目录中的文件系统事件。如果这个 观察者 脚本检测到一个事件,我想在数据库中创建一个条目(在本例中为 Mongodb)。要监视的文件系统实际上是将其文件系统链接到我的主机的 Docker 卷。所有代码都在 docker 容器中运行。我可以附加到系统中的任何容器并使用 pymongo 正确地将条目添加到数据库中。

我也可以运行 观察者 在主机上并且所有工作都按预期工作(包括如果容器中的链接文件系统对文件系统发生更改,则按预期工作。

但是,当我在容器中运行观察程序代码时,文件系统事件触发的事件处理程序中的方法似乎永远不会被调用。当然没有创建数据库条目。

有3个代码来源:

  • 监视程序目录“监视程序”,包括监视程序和处理程序 [看门狗类]
    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"

    Why are the watchdog handler events not being called?

    最佳答案

    我的问题的根源似乎不在我的代码中,而是 Docker for windows 不会通知容器您从 Windows 所做的任何文件更改 .这意味着只有在容器内对卷所做的更改对其可见。

    我找到了解决方法 here ,尽管它需要主机目录连续运行脚本。不理想,但至少它不起作用。

    关于python-3.x - 看门狗观察者不在容器中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50010421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com