如何确定哪个容器拥有哪个覆盖目录?

Mat*_*hew 11 docker

我的/var/lib/docker/overlay目录包含我的容器的数据,但目录名称都是散列的。如何确定哪个容器拥有哪个覆盖层?

Mat*_*hew 18

你可以jq像这样使用:

 docker inspect $(docker ps -qa) |  jq -r 'map([.Name, .GraphDriver.Data.MergedDir]) | .[] | "\(.[0])\t\(.[1])"'
Run Code Online (Sandbox Code Playgroud)

这使:

/traefik_traefik_1      /var/lib/docker/overlay/58df937e805ec0496bd09686394db421c129e975f67180e737d5af51751af49c/merged
/gitlab-runner  /var/lib/docker/overlay/4e5b06f4ee09c60e2dad3a0ce87352cead086eb8229775f6839a477b46dce565/merged
/rancher-agent  /var/lib/docker/overlay/6026bb65dd9a83c2088a05cff005a1dd824494222445bab46b7329dc331465aa/merged
Run Code Online (Sandbox Code Playgroud)

解释:

docker inspect $(docker ps -qa)
Run Code Online (Sandbox Code Playgroud)

显示完整的泊坞窗详细信息。

jq -r
Run Code Online (Sandbox Code Playgroud)

解析 json 并输出常规字符串:

map([.Name, .GraphDriver.Data.MergedDir])
Run Code Online (Sandbox Code Playgroud)

对于原始数组中的每个元素,找到Name和 叠加层MergedDir

"\(.[0])\t\(.[1])"
Run Code Online (Sandbox Code Playgroud)

输出数组的前两个元素。

  • 您还可以将其与“docker inform $(docker image ls -aq)”一起使用来搜索图像层 (4认同)

Vin*_*ert 13

感谢@Matthew的解决方案。这让我想到了一个仅限 Docker 的解决方案(没有 jq):

docker inspect -f $'{{.Name}}\t{{.GraphDriver.Data.MergedDir}}' $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)

您还可以使用

docker inspect -f $'{{.Name}}\t{{.GraphDriver.Data.MergedDir}}' <container_name>
Run Code Online (Sandbox Code Playgroud)

说明

我使用-fDocker inspect的选项,它允许我使用 Go 模板来格式化docker inspect.

$''在 Bash 中使用以允许像\t我的格式一样的特殊字符。


wiz*_*awu 7

docker ps -qa | xargs -I{} bash -c "docker inspect {} | grep <hash> && echo {}"
Run Code Online (Sandbox Code Playgroud)

例如,这会给你

    "LowerDir": "...<hash>...",
    "MergedDir": "...<hash>...",
    "UpperDir": "...<hash>...",
    "WorkDir": "...<hash>..."
24f8ab7ae838
Run Code Online (Sandbox Code Playgroud)

现在您可以知道容器24f8ab7ae838拥有覆盖层<hash>