把一段 Python 磁盘巡检脚本放进 Docker
上周给一台测试机做例行巡检时,我写了一段很短的 Python 脚本,用来看根分区剩余空间,并在低于阈值时打印告警。脚本本身不到四十行,但同事的环境有的是 Python 3.9,有的是 3.11,还有人把脚本直接丢到没有 pip 的精简系统里。与其互相对齐解释器版本,不如把它装进一个固定的容器里跑。这篇笔记只记录我自己这次的做法,不涉及生产集群编排。
脚本做三件事。第一,用 shutil.disk_usage 读取指定挂载点的总容量、已用和剩余字节,换算成 GiB 后保留一位小数。第二,把使用率超过百分之八十的挂载点打上 WARN,其余打上 OK。第三,把结果按固定列宽打印,方便直接贴到巡检记录里。我把阈值和挂载点列表放在脚本顶部的常量里,避免每次改逻辑。示例只检查根分区和数据盘目录;如果路径不存在就跳过并注明 missing,不让整个脚本以非零状态退出。
目录很简单:巡检脚本、一份写明无第三方依赖的依赖说明、容器构建文件,以及几行运行说明。基础镜像选择官方 Python 3.11 精简版,不使用 latest 标签。构建阶段不需要编译器,所以没有再套多阶段构建。构建文件里先设置工作目录为 opt 下的 diskcheck,再复制脚本,最后用 ENTRYPOINT 固定入口,这样运行时只追加参数即可。我在笔记里记下构建当天拉取到的镜像摘要,方便以后对照。
本地验证分两步。先在宿主机直接运行脚本并传入根路径,看输出是否符合预期,再构建一个带当天日期标签的本地镜像。构建完成后用一次性容器再跑一遍。容器里的根分区是容器自己的可写层,数值会和宿主机不同,这是预期行为。如果要看宿主机真实磁盘,需要把对应目录以只读方式挂载进去。只读是为了避免巡检容器误写数据。
我还遇到两个小坑。精简镜像默认时区是 UTC,打印时间会比北京时间早八小时,所以在构建文件里把时区设为上海,并安装时区数据包。另一个是 Windows 换行符:从编辑器拷到 Linux 后脚本报解释器错误,转成 Unix 换行就好。脚本内部还会判断路径是不是挂载点,避免把一个普通目录误当成挂载点。
这次整理让我更明确地区分“在我电脑上能跑”和“别人拉下来就能跑”。容器没有让脚本变得更聪明,只是把解释器、时区和入口命令锁死了。后续如果要加日志上报,我会再单独引入依赖并固定版本号,而不是安装时不写版本。以上内容均为个人实验记录,命令仅在测试机上使用。
- 点赞
- 收藏
- 关注作者
评论(0)