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

Dua*_*ane 41 docker

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

docker volume create --name postgres-data

docker volume ls 
Run Code Online (Sandbox Code Playgroud)

我明白了

local               postgres-data
Run Code Online (Sandbox Code Playgroud)

到目前为止都很好..

那么如何查看指定卷中的内容?有没有办法在主机系统上cd到它.就像我可以为挂载的主机目录?

Man*_*ido 71

docker run --rm -i -v=postgres-data:/tmp/myvolume busybox find /tmp/myvolume
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的答案,但我不喜欢它需要创建另一个容器来查看容器的文件系统。第一个答案避免了这一点。 (5认同)
  • 鉴于压倒性的反馈。我正在将此作为公认的答案。 (2认同)

Vai*_*gis 25

你可以跑 docker volume inspect postgres-data

并查看Mountpoint结果部分

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


Ric*_* P. 13

您可以通过运行查看 docker 存储卷的位置docker volume inspect <volume>。

但有一点需要注意:您无法在 Mac 和 Windows 上直接查看卷的内容。发生这种情况是因为 Docker 实际上运行 Linux VM 以便能够进行容器化,因为容器化是 Linux 的本机功能,而不是其他操作系统的本机功能。所以出现的路径实际上是 VM 内部的路径,而不是您的主机系统上的路径。

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

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

# This path can be slightly different on your system
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
Run Code Online (Sandbox Code Playgroud)

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

对于 Windows,请查看此答案的评论中的解决方案。

  • 在 Windows 10 上,使用 Docker Desktop 和 WSL2,您可以在 Windows 资源管理器中转到“\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes”。 (9认同)
  • docker mac 屏幕存在[问题](https://github.com/docker/for-mac/issues/4822)。2022 年的解决方法是启动一个特权容器“docker run -it --rm --privileged --pid=host alpine:edge nsenter -t 1 -m -u -n -i sh”(您应该在“/”中找到卷) var/lib/docker/volumes`) (2认同)
  • @RodneyRichardson 更新的路径是 ```\\wsl$\docker-desktop-data\data\docker\volumes\```。 (2认同)

Dar*_*tic 6

带 * jq:

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

*检查jq 文档页面以获取有关如何安装它的详细信息(如果还没有)(PACKAGE_MANAGER install jq)。


Dua*_*ane 5

这是一个想法......

docker run -it --name admin -v postgres-data:/var/lib/postgresql/data ubuntu
Run Code Online (Sandbox Code Playgroud)

然后在交互式shell中

ls /var/lib/postgresql/data 
Run Code Online (Sandbox Code Playgroud)

更好的想法欢迎!


who*_*oan 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
}
Run Code Online (Sandbox Code Playgroud)

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

$ dvolume           # for each volume, list its content
$ dvolume <volume>  # list <volume>'s content
Run Code Online (Sandbox Code Playgroud)


小智 5

或者没有必要为JQ或新的容器。

cd 到目录:

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

查看目录内容:

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

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

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

一直使用它,当需要快速找到一些东西时。