文章目录
- 简介
- 1.监听文件的代码
- 2.获取依赖列表文件
- 3.创建Dockerfile文件
- 4.上传文件到服务器上
- 5.构建容器并启动
- 6.更新main.py代码操作
简介
最近用python帮公司写了一个监控目录下文件发生变化的插件,在打包成docker镜像的过程中出现了一些小问题,特意记录一下方便以后避坑。
1.监听文件的代码
使用到了watchdog模块下面的observers 和events处理文件监听和事件处理。代码很简单如下。
import logging
import timefrom 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.1ENV PATH /usr/local/bin: $PATHRUN 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