如何查找使用指定Overlay目录的Docker镜像
定位包含指定文件的Docker镜像问题排查
问题背景
日常工作中因文档缺失,需要找到包含libimportant.so文件的Docker镜像。通过find命令定位到该文件位于本地Docker的Overlay2层中:
$ sudo find / -name libimportant.so 2>/dev/null /var/lib/docker/overlay2/fedc8afc375f5bf02c74542b5d3a2621fcfd522875dff06bbb63fff6d1251234/diff/usr/lib64/libimportant.so
本地有200多个Docker镜像,且当前无运行容器,需要找出使用该Overlay层的镜像。
尝试的两种方法及问题
方法1:创建容器导出搜索(耗时过长未完成)
尝试遍历所有镜像,创建临时容器后导出文件列表搜索目标文件,但因镜像数量过多,耗时太长中途终止:
$ docker image ls -qa | while read -r _hash; do _container="$(docker create "$_hash")"; docker container export "$_container" | tar t | grep -q 'libimportant.so' && echo "$_hash"; docker container rm "$_container" >/dev/null; done ^C $
方法2:检查镜像GraphDriver数据(无结果)
尝试通过docker image inspect查看每个镜像的GraphDriver数据,匹配Overlay层哈希,但未得到任何结果:
$ docker image ls -qa | while read -r imageid; do docker image inspect --format '{{json .GraphDriver.Data}}' "$imageid" | grep -q 'fedc8afc375f5bf02c74542b5d3a2621fcfd522875dff06bbb63fff6d1251234' && echo "$imageid"; done $
Docker版本信息
$ docker version Client: Docker Engine - Community Version: 19.03.13 API version: 1.40 Go version: go1.13.15 Git commit: 4484c46d9d Built: Wed Sep 16 17:02:52 2020 OS/Arch: linux/amd64 Experimental: false
根因分析与解决
后续排查发现,/etc/docker/daemon.json中data-root被配置为非/var/lib/docker的目录,导致/var/lib/docker下的Overlay层并非当前docker image ls列出的镜像所使用的存储层。修正data-root配置后,使用方法2的GraphDriver数据匹配方式成功找到目标镜像。
内容的提问来源于stack exchange,提问作者Svintoo
相关产品推荐
相关产品推荐

