如何在Docker 1.9+中列出命名卷的内容?


76

Docker 1.9添加了命名卷,所以我..

docker volume create --name postgres-data

docker volume ls 

我得到

local               postgres-data

到目前为止一切都很好。

所以我怎么看命名卷中的内容?有没有一种方法可以在主机系统上对其进行cd。就像我可以为挂载的主机目录一样吗?

Answers:


122
docker run --rm -i -v=postgres-data:/tmp/myvolume busybox find /tmp/myvolume

说明:使用工具创建一个最小的容器,以查看该卷的文件(busybox),将命名的卷安装在容器的目录(v=postgres-data:/tmp/myvolume),列出该卷的文件(find /tmp/myvolume)。列出完毕后,移走容器(--rm)。


4
这是一个很好的答案,但我不喜欢它需要创建另一个容器来查看容器的文件系统。第一个答案可以避免这种情况。
杜安(Duane)'18

1
第一个答案对我不起作用。目录不存在。这个答案有效。
罗布

2
鉴于压倒性的反馈。我正在接受这个答案。
杜安(Duane)

在下面查看我的答案,以查看为什么在Mac或Windows上无法访问该路径。
里卡多·佩德罗尼

把你的观点告诉我的朋友。你刚刚救了我的命。

36

你可以跑 docker volume inspect postgres-data

并查看Mountpoint结果部分

因此源参数将指向主机目录或 /var/lib/docker/volumes/[volume_name]/_data目录


几乎是正确的...我尝试过,这个答案对一个数据量容器很有效。.我想你可能是说.. docker volume inspect postgres-data
杜安

您是否尝试运行您的书面命令?我怀疑它会起作用,因为您必须传递卷哈希而不是容器的名称。您可以使用docker volume ls
Vaidas Lungis

@ vaidasniedu02 @ ubuntu:〜/ assistant $泊坞窗卷检查postgres-data` [{“名称”:“ postgres-data”,“驱动程序”:“本地”,“挂载点”:“ / var / lib / docker / volumes / postgres-data / _data“}]
杜安

1
是的,它适用于命名 ,这是docker 1.9中添加的新功能。我认为您的答案是针对命名 容器,而不是命名卷。测试它并更新答案,以便我可以将您的答案标记为正确。
杜安

2
为什么这是公认的答案?它没有回答问题。
ajh158 '18 -10-8

9

这是一个主意...

docker run -it --name admin -v postgres-data:/var/lib/postgresql/data ubuntu

然后在交互式外壳中

ls /var/lib/postgresql/data 

欢迎更好的想法!


8

您可以通过运行查看docker在何处存储卷docker volume inspect <volume>

但有一个警告:您无法在Mac和Windows上直接看到卷的内容。发生这种情况是因为Docker实际上运行的是Linux VM以便能够进行容器化,因为containzerzation是Linux的本机功能,而不是其他OS的本机功能。因此,显示的路径实际上是VM内的路径,而不是主机系统上的路径。

您可以使用其他答案中提到的方法来访问这些卷(创建一个临时容器只是为了查看内容),也可以直接访问它们。

对于Mac,您可以使用screen来访问VM,如下所示:

# This path can be slightly different on your system
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

到达那里后,您可以导航到docker volume inspect给您的路径。

对于Windows,请在此答案的注释中查看解决方案。


2
在Windows 10上,使用Docker Desktop和WSL2,可以\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes在Windows资源管理器中转到。
罗德尼·理查森

上面很棒的评论-在Windows git bash上,您可以使用... cd // cd // wsl $ / docker-desktop-data / version-pack-data / community /
docker

5

我使用这个方便的功能来列出我的卷的内容:

dvolume() {
  local volume volumes_to_list=${1:-$(docker volume ls --quiet)}
  for volume in $volumes_to_list; do
    sudo ls -lRa "$(docker volume inspect --format '{{ .Mountpoint }}' "$volume")"
    echo
  done
}

注意,您可以通过两种方式调用该函数:

$ dvolume           # for each volume, list its content
$ dvolume <volume>  # list <volume>'s content

我不会使用这种方法,我相信这可能会导致某些卷文件权限在错误状态下发生变异。它损坏了我正在处理的卷
StanleyZheng,

1
我真的很想知道有关您所谈论的问题的更多详细信息。谢谢。
whoan '19

@StanleyZheng如果提供的shell脚本仅列出目录内容,那么如何更改卷的文件权限?
艾伦·

5

带* jq

$ sudo ls -l $(docker volume inspect VOLUME_NAME | jq -r '.[0].Mountpoint')

*如果尚未安装,请查看jq doc页面以获取有关如何安装的详细信息(PACKAGE_MANAGER install jq)。


3

或者没有必要JQ新的容器

cd 到目录:

cd $(docker volume inspect <volume name> | grep Mountpoint | cut -d\" -f 4)

查看目录的内容:

ls -las $(docker volume inspect <volume name> | grep Mountpoint | cut -d\" -f 4)

更好!查看所有卷的内容:__

for i in  `docker volume ls -q`; do echo volume: ${i}; \
ls -las $(docker volume inspect $i | grep Mountpoint | cut -d\" -f 4); \
done

当需要快速查找某些内容时,始终使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.