当使用来自注册表的docker镜像时,我经常需要查看图像容器创建的卷。
注意:我在Red Hat 7上使用的是docker 1.3.2版。
Docker Registry中的postgres
官方图片为/var/lib/postgresql/data
的容器配置了一个卷。
在/var/lib/postgresql/data
容器中以postgres
显示音量的最简洁命令是什么?
答案 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
时,Volumes
和VolumesRW
字段会为您提供有关容器内安装的卷的 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
指令挂载/config
和VOLUME
卷。容器不需要运行才能获取此信息,但它必须至少运行一次才能填充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>