在端侧,经常需要将一个容器的安装了哪些系统包(如deb、rpm)准确识别出来。
方法1:使用类似 docker exec CONTAINER_ID CMD
的方式
这种方式能达到目的,但有如下缺点:
- 依赖docker命令可用。一些情况下可能不成立(对程序有较高的兼容适配成本):
- 没装docker这个工具或者改名了
- sock文件文件路径不是默认的
- 需要tls认证
- 如果需要适配containerd, 代码也要适配一套, 并同样面临上述问题
方法2:使用chroot
具体步骤如下:
- 找到容器的
根进程
- 注意这里找 /proc/PID, 也不能通过docker, 可以参考这篇文章: juejin.cn/post/722637…
chroot /proc/PID/root '/bin/bash'
- 执行对应的 apt 或者yum命令,示例如下
结论
方法2是一种通用的方案, 对外部依赖少, 同时不关心运行时的差异, 不存在兼容适配问题, 整体代码都比较好维护, 常用于: 容器内业务资产的盘点
另外如果需要做更加细粒度的资产盘点,那么可能还要配合 namespace 使用。