如何找出overlay2目录下哪个文件夹属于哪个容器?

12
如果我进入 /var/lib/docker/overlay2,并执行 "ls" 命令,则会得到以下类似的内容:
0349eb19b8ac737f2a93e33f665ab26d95de636bf48de79e6e7d7cdd76c0cd78 0c32910d4c394834e239f0c8f0776b36d87f7567b3120dff92ccd8d0f98577b0 ...
现在,其中一个或多个文件夹属于一个容器。我想知道哪个文件夹被哪个容器使用?
谢谢
5个回答

19

可以使用这个命令

for container in $(docker ps --all --quiet --format '{{ .Names }}'); do
    echo "$(docker inspect $container --format '{{.GraphDriver.Data.MergedDir }}' | \
      grep -Po '^.+?(?=/merged)'  ) = $container"
done

如果在overlay2中有文件夹未出现在您的命令输出中,那么它们就不再使用了吗? - rené

9
现在这些文件夹都属于一个容器。
不是这样的。一个容器可能会使用其中一个或多个文件夹。但是同一个文件夹可能会在多个容器中使用。这就是docker中图层重用的工作原理,它被下载或构建一次,然后作为覆盖文件系统中的一个图层被重复使用。
因此,没有从overlay2目录到“一个”容器的映射。但是您可以查看每个容器和镜像,以查看它正在使用哪些目录进行各种层的操作。
$ docker container inspect --format '{{json .GraphDriver.Data }}' ${container_id} | jq .
{
  "LowerDir": "/var/lib/docker/overlay2/772a19168d50648e1bfb156604281a6acedb9025e588fe35da97deb18b95150a-init/diff:/var/lib/docker/overlay2/ixbbgqs1303yho2a3dcwwlw2u/diff:/var/lib/docker/overlay2/vdywc8lgvc3uzoq8z2m2j49io/diff:/var/lib/docker/overlay2/l4ykndb21ul7ttmsdn05ps3q5/diff:/var/lib/docker/overlay2/66fce03abb53f3576b039c5177e687f304d1a7ddb78d57392b8825ab34350299/diff",
  "MergedDir": "/var/lib/docker/overlay2/772a19168d50648e1bfb156604281a6acedb9025e588fe35da97deb18b95150a/merged",
  "UpperDir": "/var/lib/docker/overlay2/772a19168d50648e1bfb156604281a6acedb9025e588fe35da97deb18b95150a/diff",
  "WorkDir": "/var/lib/docker/overlay2/772a19168d50648e1bfb156604281a6acedb9025e588fe35da97deb18b95150a/work"
}

$ docker image inspect --format '{{json .GraphDriver.Data}}' ${image_name} | jq .
{
  "LowerDir": "/var/lib/docker/overlay2/vdywc8lgvc3uzoq8z2m2j49io/diff:/var/lib/docker/overlay2/l4ykndb21ul7ttmsdn05ps3q5/diff:/var/lib/docker/overlay2/66fce03abb53f3576b039c5177e687f304d1a7ddb78d57392b8825ab34350299/diff",
  "MergedDir": "/var/lib/docker/overlay2/ixbbgqs1303yho2a3dcwwlw2u/merged",
  "UpperDir": "/var/lib/docker/overlay2/ixbbgqs1303yho2a3dcwwlw2u/diff",
  "WorkDir": "/var/lib/docker/overlay2/ixbbgqs1303yho2a3dcwwlw2u/work"
}

在文件系统层面上,您还可以查看/var/lib/docker/containers/${container_id}/config.v2.json

请注意,所有这些都是Docker内部的内容,不能保证在下一个版本中不会更改。您不应直接与这些文件和目录交互,因为Docker不知道您是否进行了破坏性更改,并且不会通过再次下载层来修复损坏的镜像。正如其他人发现的那样,当您打破它时, 您将获得两个碎片作为纪念品,以示不要做什么。


非常感谢,这很有帮助。我能够使用 docker inspect -f $'{{.Id}}\t{{.RepoTags}}\t{{.GraphDriver.Data}}' $(docker image ls -q) 显示所有的图像。 - Jayen
经过一些处理以便使用 JSON,但需要 jq:docker image ls -q | xargs docker inspect | jq '[.[]|{tags:.RepoTags,image:.Id,layers:([.GraphDriver.Data[]|split(":")]|flatten)}]' - Hannes

1
你可以使用docker inspect命令获取有关容器的所有信息,其中将提供包括卷在内的信息。
docker inspect <container name/id>

你可以使用命名卷来为这些卷命名。
参考: https://docs.docker.com/storage/volumes/

0
以下命令可以清晰地显示容器及其占用的存储空间、镜像和空间使用情况。
docker system df -v

0
我使用以下方法来识别使用这些文件夹的容器,
- docker ps | awk '{print $1}'(将其保存在文件中 - continerid)

#!/bin/bash
input="./containerid"
while IFS= read -r line
do
  echo "$line"
  docker inspect $line | grep -i "5b....."
done < "$input"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接