python使用watchdog监听文件变化并打包成docker镜像

发布时间:2023年12月29日

简介

最近用python帮公司写了一个监控目录下文件发生变化的插件,在打包成docker镜像的过程中出现了一些小问题,特意记录一下方便以后避坑。

1.监听文件的代码

使用到了watchdog模块下面的observers 和events处理文件监听和事件处理。代码很简单如下。

import logging
import time

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

"""
监控文件变化
"""
class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        if not event.is_directory:
            logging.info(f"{event.src_path} on_created")
    def on_modified(self, event):
        if not event.is_directory:
            logging.info(f"{event.src_path} on_modified")
    def on_deleted(self, event):
        if not event.is_directory:
            logging.info(f"{event.src_path} on_deleted")



if __name__ == "__main__":
    #配置log打印格式
    logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
    #docker容器里的路径,需要挂载宿主机的路径
    listenPath="/app/data/"
    logging.info("监听的目录:"+listenPath)
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, listenPath, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

2.获取依赖列表文件

由于用到了非系统库的第三方模块watchdog,在服务器上面部署的时候需要通过pip下载依赖后才能运行代码。

安装pipreqs模块生成依赖版本信息文件

pip install pipreqs

生成文件的命令如下, ./表示生成文件的存储路径

pipreqs ./ --encoding=utf8 --force

在根目录执行命令后会生成一个requirements.txt文件,如下所示。
在这里插入图片描述

3.创建Dockerfile文件

#添加依赖的python镜像版本
FROM  python:3.12.1

ENV PATH /usr/local/bin: $PATH

RUN mkdir -p /app/data

#设置工作目录
WORKDIR /app

#将代码添加到镜像中
ADD . /app

#设置阿里云库
RUN pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 安装依赖包
RUN pip install -r requirements.txt

#挂载目录
VOLUME ["/app/data"]

#设置容器作者
MAINTAINER Dominick Li

#容器启动执行的名称
CMD [ "python", "main.py"]

4.上传文件到服务器上

把main.py、requirements.txt、Dockerfile到某个目录下,并创建data目录用于挂载映射容器里的路径
在这里插入图片描述
构建名称为watchfile版本为v1的镜像

docker build  -t watchfile:v1 .

没有报错则表示构建成功了
在这里插入图片描述

5.构建容器并启动

下面把宿主机的/home/watchfile/data挂载到了容器里的/app/data目录

#创建并运行容器
docker run -d \
-v /home/watchfile/data:/app/data \
--name watchfile watchfile:v1

上传文件到 /home/watchfile/data下,然后修改文件并删除,然后在服务器上面查看日志

docker logs watchfile

在这里插入图片描述

6.更新main.py代码操作

由于代码的存放路径没有挂载到宿主机上面,需要通过复制的方式把新文件复制到容器中,然后再重启容器即可

docker cp main.py watchfile:/app/main.py
docker restart watchfile

在这里插入图片描述

文章来源:https://blog.csdn.net/ming19951224/article/details/135290996
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。