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

如何在docker 1.9+;中列出命名卷的内容;?,docker,Docker,Docker 1.9添加了命名卷,因此I docker volume create --name postgres-data docker volume ls 我得到 local postgres-data 到目前为止一切都很好 那么,如何查看命名卷中的内容呢?有没有办法在主机系统上通过cd将其传送到计算机上。就像我可以为一个挂载的主机目录做什么一样?这里有一个想法 docker run -it --name admin -v postgres-data:/v

Docker 1.9添加了命名卷,因此I

docker volume create --name postgres-data

docker volume ls 
我得到

local               postgres-data
到目前为止一切都很好

那么,如何查看命名卷中的内容呢?有没有办法在主机系统上通过cd将其传送到计算机上。就像我可以为一个挂载的主机目录做什么一样?

这里有一个想法

docker run -it --name admin -v postgres-data:/var/lib/postgresql/data ubuntu
然后在交互式shell中

ls /var/lib/postgresql/data 
好主意欢迎

你可以跑步
docker卷检查postgres数据

请参见结果的
Mountpoint
部分

因此,源参数将指向主机目录 大概
/var/lib/docker/volumes/[volume\u name]/\u data
目录

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

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

我使用此方便的功能列出卷的内容:

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
$dvolume#对于每个卷,列出其内容
$dvolume#列表的内容
与*
jq

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

*如果尚未安装,请查看有关如何安装的详细信息(
PACKAGE\u MANAGER install jq
)。

无需安装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)

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

通过运行
docker volume inspect
,您可以看到docker在哪里存储卷

但有一个警告:你不能在Mac和Windows上直接看到卷的内容。 之所以会出现这种情况,是因为Docker实际上运行Linux虚拟机以实现容器化,因为容器化是Linux的本机功能,而不是其他操作系统。因此,出现的路径实际上是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,请查看此答案注释中的解决方案。

是否尝试运行书面命令?我怀疑它是否有效,因为您必须传递卷哈希而不是容器名称。您可以使用
docker volume ls
@vaidasniedu02@ubuntu:~/assistant$docker volume inspect postgres data`[{“Name”:“postgres data”,“Driver”:“local”,“Mountpoint”:“/var/lib/docker/volumes/postgres data/_data”}]是的,它适用于命名卷,这是docker 1.9中添加的新功能。我认为您的答案是针对命名容器,而不是命名卷。测试它并更新答案,这样我就可以标记你的答案正确。在Mac中,你需要额外的步骤:这是一个好答案,但我不喜欢它需要创建另一个容器来查看容器的文件系统。第一个答案避免了这一点。第一个答案对我不起作用。那里不存在目录。这个答案奏效了。给出了压倒性的反馈。我将此作为公认的答案。请在下面查看我的答案,以了解在Mac或Windows上无法访问路径的原因。我的朋友,请接受您的观点。你刚刚救了我的命。我不会使用这种方法,我相信这可能会导致某些卷文件权限在错误状态下发生变异。它损坏了我正在工作的一卷。我真的很想知道关于您所谈论的问题的更多细节。谢谢。@StanleyZheng如果提供的shell脚本仅列出目录内容,卷的文件权限如何更改?在Windows 10上,使用Docker Desktop和WSL2,您可以在Windows资源管理器中转到
\\wsl$\docker desktop data\version pack data\community\docker\volumes
。上面的精彩评论-在Windows git bash上,您可以用cd将其刻录到。。。cd//wsl$/docker桌面数据/版本包数据/社区/docker/卷
# This path can be slightly different on your system
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty