如何在docker容器中列出卷?

时间:2015-05-08 22:18:17

标签: docker

当使用来自注册表的docker镜像时,我经常需要查看图像容器创建的卷。

注意:我在Red Hat 7上使用的是docker 1.3.2版。

实施例

Docker Registry中的postgres官方图片为/var/lib/postgresql/data的容器配置了一个卷。

/var/lib/postgresql/data容器中以postgres显示音量的最简洁命令是什么?

15 个答案:

答案 0 :(得分:190)

使用docker ps获取容器ID。

然后docker inspect -f '{{ .Mounts }}' containerid

示例:

终端1

$ docker run -it -v /tmp:/tmp ubuntu:14.04 /bin/bash

终端2

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
ddb7b55902cc        ubuntu:14.04        "/bin/bash"         About a minute ago   Up About a minute                       distracted_banach   

$ docker inspect -f "{{ .Mounts }}" ddb7
map[/tmp:/tmp]

输出

map[/tmp:/tmp] 
显然,

是由于使用 Go 语言来实现docker命令工具。

没有docker inspect的{​​{1}}命令非常详细。因为它是JSON,你可以将它传递给python或nodejs并提取你需要的任何东西。

-f format

paul@home:~$ docker inspect ddb7 [{ "AppArmorProfile": "", "Args": [], "Config": { "AttachStderr": true, "AttachStdin": true, "AttachStdout": true, "Cmd": [ "/bin/bash" ], "CpuShares": 0, "Cpuset": "", "Domainname": "", "Entrypoint": null, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "ExposedPorts": null, "Hostname": "ddb7b55902cc", "Image": "ubuntu:14.04", "MacAddress": "", "Memory": 0, "MemorySwap": 0, "NetworkDisabled": false, "OnBuild": null, "OpenStdin": true, "PortSpecs": null, "StdinOnce": true, "Tty": true, "User": "", "Volumes": null, "WorkingDir": "" }, "Created": "2015-05-08T22:41:44.74862921Z", "Driver": "devicemapper", "ExecDriver": "native-0.2", "ExecIDs": null, "HostConfig": { "Binds": [ "/tmp:/tmp" ], "CapAdd": null, "CapDrop": null, "ContainerIDFile": "", "Devices": [], "Dns": null, "DnsSearch": null, "ExtraHosts": null, "IpcMode": "", "Links": null, "LxcConf": [], "NetworkMode": "bridge", "PidMode": "", "PortBindings": {}, "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "RestartPolicy": { "MaximumRetryCount": 0, "Name": "" }, "SecurityOpt": null, "VolumesFrom": null }, "HostnamePath": "/var/lib/docker/containers/ddb7b55902cc328612d794570fe9a936d96a9644411e89c4ea116a5fef4c311a/hostname", "HostsPath": "/var/lib/docker/containers/ddb7b55902cc328612d794570fe9a936d96a9644411e89c4ea116a5fef4c311a/hosts", "Id": "ddb7b55902cc328612d794570fe9a936d96a9644411e89c4ea116a5fef4c311a", "Image": "ed5a78b7b42bde1e3e4c2996e02da778882dca78f8919cbd0deb6694803edec3", "MountLabel": "", "Name": "/distracted_banach", "NetworkSettings": { "Bridge": "docker0", "Gateway": "172.17.42.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.4", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "fe80::42:acff:fe11:4", "LinkLocalIPv6PrefixLen": 64, "MacAddress": "02:42:ac:11:00:04", "PortMapping": null, "Ports": {} }, "Path": "/bin/bash", "ProcessLabel": "", "ResolvConfPath": "/var/lib/docker/containers/ddb7b55902cc328612d794570fe9a936d96a9644411e89c4ea116a5fef4c311a/resolv.conf", "RestartCount": 0, "State": { "Error": "", "ExitCode": 0, "FinishedAt": "0001-01-01T00:00:00Z", "OOMKilled": false, "Paused": false, "Pid": 6115, "Restarting": false, "Running": true, "StartedAt": "2015-05-08T22:41:45.367432585Z" }, "Volumes": { "/tmp": "/tmp" }, "VolumesRW": { "/tmp": true } } ] 将显示烘焙到图像中的图层。不幸的是,docker history <image name>似乎因格式化而缺乏选择显示内容的选项。

您可以通过--no-trunc标志选择简洁和详细格式。

docker history

这是一个冗长的例子。

$ docker history drpaulbrewer/spark-worker
IMAGE               CREATED             CREATED BY                                      SIZE
438ff4e1753a        2 weeks ago         /bin/sh -c #(nop) CMD [/bin/sh -c /spark/my-s   0 B
6b664e299724        2 weeks ago         /bin/sh -c #(nop) ADD file:09da603c5f0dca7cc6   296 B
f6ae126ae124        2 weeks ago         /bin/sh -c #(nop) MAINTAINER drpaulbrewer@eaf   0 B
70bcb3ffaec9        2 weeks ago         /bin/sh -c #(nop) EXPOSE 2222/tcp 4040/tcp 60   0 B
1332ac203849        2 weeks ago         /bin/sh -c apt-get update && apt-get --yes up   1.481 GB
8e6f1e0bb1b0        2 weeks ago         /bin/sh -c sed -e 's/archive.ubuntu.com/www.g   1.975 kB
b3d242776b1f        2 weeks ago         /bin/sh -c #(nop) WORKDIR /spark/spark-1.3.1    0 B
ac0d6cc5aa3f        2 weeks ago         /bin/sh -c #(nop) ADD file:b6549e3d28e2d149c0   25.89 MB
6ee404a44b3f        5 weeks ago         /bin/sh -c #(nop) WORKDIR /spark                0 B
c167faff18cf        5 weeks ago         /bin/sh -c adduser --disabled-password --home   335.1 kB
f55d468318a4        5 weeks ago         /bin/sh -c #(nop) MAINTAINER drpaulbrewer@eaf   0 B
19c8c047d0fe        8 weeks ago         /bin/sh -c #(nop) CMD [/bin/bash]               0 B
c44d976a473f        8 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.879 kB
14dbf1d35e28        8 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   701 B
afa7a164a0d2        8 weeks ago         /bin/sh -c #(nop) ADD file:57f97478006b988c0c   131.5 MB
511136ea3c5a        23 months ago                                                       0 B

答案 1 :(得分:82)

使用docker 1.10,您现在可以使用新的数据量容器命令 (对于常规容器,请参阅下一节,对于docker 1.8 +):

使用docker 1.8.1(2015年8月),docker inspect -f '{{ .Volumes }}' containerid为空!

您现在需要检查 Mounts ,这是一个已安装路径的列表,如:

   "Mounts": [
       {
           "Name": "7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2",
           "Source": "/mnt/sda1/var/lib/docker/volumes/7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2/_data",
           "Destination": "/home/git/repositories",
           "Driver": "local",
           "Mode": "",
           "RW": true
       }
   ],

如果你想要第一个 mount的路径(例如),那就是(使用索引0):

docker inspect -f '{{ (index .Mounts 0).Source }}' containerid

正如Mike Mitterer评论below

  

相当印刷整个事情:

 docker inspect -f '{{ json .Mounts }}' containerid | python -m json.tool 

或者,commented作为Mitja,使用jq command

docker inspect -f '{{ json .Mounts }}' containerid | jq 

答案 2 :(得分:19)

我实际上是在Google上搜索的,并找到了自己的答案:)这些天的记忆...对于那些不了解它的人,commandlinefu是查找和发布这些摘要的好地方。

按容器列出docker卷。

docker ps -a --format '{{ .ID }}' | xargs -I {} docker inspect -f '{{ .Name }}{{ printf "\n" }}{{ range .Mounts }}{{ printf "\n\t" }}{{ .Type }} {{ if eq .Type "bind" }}{{ .Source }}{{ end }}{{ .Name }} => {{ .Destination }}{{ end }}{{ printf "\n" }}' {}

示例输出。

root@jac007-truserv-jhb1-001 ~/gitlab $ docker ps -a --format '{{ .ID }}' | xargs -I {} docker inspect -f '{{ .Name }}{{ printf "\n" }}{{ range .Mounts }}{{ printf "\n\t" }}{{ .Type }} {{ if eq .Type "bind" }}{{ .Source }}{{ end }}{{ .Name }} => {{ .Destination }}{{ end }}{{ printf "\n" }}' {}
/gitlab_server_1

    volume gitlab-data => /var/opt/gitlab
    volume gitlab-config => /etc/gitlab
    volume gitlab-logs => /var/log/gitlab

/gitlab_runner_1

    bind /var/run/docker.sock => /var/run/docker.sock
    volume gitlab-runner-config => /etc/gitlab-runner
    volume 35b5ea874432f55a26c769e1cdb1ee3f06f78759e6f302e3c4b4aa40f3a495aa => /home/gitlab-runner

答案 3 :(得分:16)

显示容器使用的卷的名称和装入点目标:

docker container inspect \
 -f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}' \
 CONTAINER_ID_OR_NAME

这与Docker 1.13兼容。

答案 4 :(得分:8)

您可以通过检查容器并查看JSON输出并比较几个字段来获取有关哪些卷专门烘焙到容器中的信息。当您运行docker inspect myContainer时,VolumesVolumesRW字段会为您提供有关容器内安装的卷的 ALL 的信息,包括安装在Dockerfile中的卷VOLUME指令,以及带有docker run -v命令的命令行。但是,通过检查docker run -v JSON输出中的HostConfig.Binds字段,可以使用docker inspect命令隔离容器中装入的卷。为了澄清,这个HostConfig.Binds字段告诉您使用docker run选项在-v命令中专门装入了哪些卷。因此,如果您使用Volumes字段交叉引用此字段,则可以使用Dockerfile中的VOLUME指令确定将哪些卷烘焙到容器中。

grep可以实现这一目标:

$ docker inspect myContainer | grep -C2 Binds
...
"HostConfig": {
    "Binds": [
        "/var/docker/docker-registry/config:/registry"
    ],

和...

$ docker inspect myContainer | grep -C3 -e "Volumes\":"
...
"Volumes": {
    "/data": "/var/lib/docker...",
    "/config": "/var/lib/docker...",
    "/registry": "/var/docker/docker-registry/config"

在我的示例中,您可以使用/var/docker/docker-registry/config命令中的/registry选项看到我已将-v作为docker run挂载到容器中,而且我已经使用我的Dockerfile中的/data指令挂载/configVOLUME卷。容器需要运行才能获取此信息,但它必须至少运行一次才能填充HostConfig的{​​{1}} JSON输出命令。

答案 5 :(得分:7)

对于Docker 1.8,我使用:

$ docker inspect -f "{{ .Config.Volumes }}" 957d2dd1d4e8
map[/xmount/dvol.01:{}]
$ 

答案 6 :(得分:6)

以下是一行命令,用于获取运行容器的卷信息:

for contId in `docker ps -q`; do echo "Container Name: "   `docker ps -f "id=$contId" | awk '{print $NF}' | grep -v NAMES`; echo "Container Volume: " `docker inspect -f '{{.Config.Volumes}}' $contId`; docker inspect -f '{{ json .Mounts }}' $contId  | jq '.[]';   printf "\n"; done

输出是:

root@ubuntu:/var/lib# for contId in `docker ps -q`; do echo "Container Name: "   `docker ps -f "id=$contId" | awk '{print $NF}' | grep -v NAMES`; echo "Container Volume: " `docker inspect -f '{{.Config.Volumes}}' $contId`; docker inspect -f '{{ json .Mounts }}' $contId  | jq '.[]';   printf "\n"; done

Container Name:  freeradius
Container Volume:  map[]

Container Name:  postgresql
Container Volume:  map[/run/postgresql:{} /var/lib/postgresql:{}]
{
  "Propagation": "",
  "RW": true,
  "Mode": "",
  "Driver": "local",
  "Destination": "/run/postgresql",
  "Source":     "/var/lib/docker/volumes/83653a53315c693f0f31629f4680c56dfbf861c7ca7c5119e695f6f80ec29567/_data",
  "Name": "83653a53315c693f0f31629f4680c56dfbf861c7ca7c5119e695f6f80ec29567"
}
{
  "Propagation": "rprivate",
  "RW": true,
  "Mode": "",
  "Destination": "/var/lib/postgresql",
  "Source": "/srv/docker/postgresql"
}

Container Name:  rabbitmq
Container Volume:  map[]

Docker版本:

root@ubuntu:~# docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:44:32 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 21:44:32 2016
 OS/Arch:      linux/amd64

答案 7 :(得分:3)

docker-compose用户的有用变体:

docker-compose ps -q | xargs docker container inspect  \
   -f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}' 

这将非常巧妙地输出可解析的音量信息。我的wordpress docker-compose示例:

ubuntu@core $ docker-compose ps -q | xargs docker container inspect  -f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}' 
core_wpdb:/var/lib/mysql 
core_wpcode:/code core_wphtml:/var/www/html 

输出包含每个容器的一行,列出了所使用的卷(和挂载点)。更改 {{.Name}}:{{.Destination}} 部分以输出您想要的信息。

如果您只想要一个简单的卷列表,每行一个

$ docker-compose ps -q | xargs docker container inspect  \
   -f '{{ range .Mounts }}{{ .Name }} {{ end }}' \
   | xargs -n 1 echo
core_wpdb
core_wpcode
core_wphtml

非常适合生成要备份的卷列表。我使用此技术和Blacklabelops Volumerize来备份docker-compose中所有容器使用的所有卷。 Volumerize的文档不会将其调出,但您不需要在持久容器中使用它,也不需要使用内置工具来启动和停止服务。我更喜欢将关键操作(如备份和服务控制)留给实际用户(docker之外)。我的备份由实际(非docker)用户帐户触发,并使用docker-compose stop来停止服务,备份所有正在使用的卷,最后docker-compose start to restart。

答案 8 :(得分:3)

如果您想列出所有容器名称以及附加到每个容器的相关卷,您可以尝试这样做:

docker ps -q | xargs docker container inspect -f '{{ .Name }} {{ .HostConfig.Binds }}'

示例输出:

  

/ opt_rundeck_1 [/ opt / var / lib / mysql:/ var / lib / mysql:rw   的/ var / lib中/ rundeck的/ var /储存:在/ var / lib中/ rundeck的/ var /存储:RW   /opt/var/rundeck/.ssh:/var/lib/rundeck/.ssh:rw   / opt / etc / rundeck:/ etc / rundeck:rw / var / log / rundeck:/ var / log / rundeck:rw   /选择/ rundeck-插件中:/ opt / rundeck-插件:RW   /选择的/ var / rundeck:在/ var / rundeck:RW]

/ opt_rundeck_1 - 容器名称

[..] - 附加到conatiner的卷

答案 9 :(得分:1)

docker inspect -f '{{ json .Mounts }}' containerid | jq '.[]'

答案 10 :(得分:1)

这是我的版本,用于查找docker compose的挂载点。 在使用它来备份卷。

 # for Id in $(docker-compose -f ~/ida/ida.yml ps -q); do docker inspect -f '{{ (index .Mounts 0).Source }}' $Id; done
/data/volumes/ida_odoo-db-data/_data
/data/volumes/ida_odoo-web-data/_data

这是以前解决方案的组合。

答案 11 :(得分:1)

我们可以不用-f Go模板语法来做到这一点:

docker inspect <CONTAINER_ID> | jq .[] | jq .Mounts[]

第一个jq操作jq .[]剥离对象{}包装器。

第二个jq操作将返回所有的Mount项目。

答案 12 :(得分:0)

如果您使用的是pwsh(powershell内核),则可以尝试

(docker ps --format='{{json .}}' |  ConvertFrom-Json).Mounts

您还可以在下面看到容器名称和挂载

docker ps --format='{{json .}}' |  ConvertFrom-Json | select Names,Mounts

由于将输出转换为json,因此可以获得它具有的所有属性。

答案 13 :(得分:0)

来自Docker文档here

.Mounts Names of the volumes mounted in this container.

docker ps -a --no-trunc --format "{{.ID}}\t{{.Names}}\t{{.Mounts}}"

应该工作

答案 14 :(得分:0)

使用 Type:Source:Destination 格式打印坐骑:

docker container inspect \
    -f ''{{range .Mounts}}{{.Type}}:{{.Source}}:{{.Destination}}{{println}}{{ end }}'' \
    <containerId>

要仅打印带有 Source 的 Mounts 的 Type="volume"

docker container inspect \
    -f '{{range .Mounts}}{{ if eq .Type "volume" }}{{println .Source }}{{ end }}{{end}}' \
    <containerId>