问你一个问题:你有关注过容器的存储ID吗?
什么意思?让我们慢慢说······
最近今天,集团在做主机安全的扫描,说我的某个主机上fastjson的版本太低了,要求整改。
接到这样的信息,当然很紧张,赶紧登录到主机,进行排查,可是,找了半天,没有发现和扫描出来的目录一样的fastjson的版本,怎么办?使用最后一招:find全主机去检索。
find / -name *fastjson*
果不其然,的确发现了fastjson的jar包
but,仔细一看,是容器里面的
想了下,overlay2应该是容器的存储的部分。
那么问题来了,如何通过容器的存储ID找到对应的容器?
你猜对了,就是充分利用docker inspect的格式化输出:
对于容器来说,存储文件系统的格式是什么呢?
./docker/overlay2/存储ID/diff/目录
那么,我们用inspect命令,来看看,是否可以过滤出来这个存储ID对应的容器ID
docker inspect -f $'{{.Name}}\t{{.GraphDriver.Data.MergedDir}}' \
$(docker ps -aq) \
| grep 47311490824bdf3b1f1651817f4c343a067086364396b3474cf933625a7b3e53
发现没有,也就是运行的容器没有,那么就只有在镜像里面了,我们继续看:
docker inspect -f $'{{.RepoTags}}\t{{.GraphDriver.Data.LowerDir}}' \
$(docker images -q) \
| grep 47311490824bdf3b1f1651817f4c343a067086364396b3474cf933625a7b3e53
让人惊喜的是,成功找到了这个存储层对应的镜像。
这样,我们就更加精准的定位到哪个镜像,哪个容器有这个fastjson的包了。
总结一下:
- 通过存储ID找到对应的容器ID
- 通过存储ID找到对应的镜像ID