How do you specify volumes in docker containers?

When using docker images from registries, I often need to see volumes created by image containers.

Note. I am using docker version 1.3.2 in Red Hat 7.

Example

The official postgres image from the Docker registry has a volume configured for containers in /var/lib/postgresql/data .

What is the most concise command to display volume in /var/lib/postgresql/data in a postgres container?

+146
docker
May 08 '15 at 10:18
source share
11 answers

Use docker ps to get the container id.

Then docker inspect -f '{{ .Mounts }}' containerid

Example:

terminal 1

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

terminal 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] 

Exit

 map[/tmp:/tmp] 

apparently related to using Go language to implement docker command line tools.

The docker inspect without -f format pretty verbose. Since this is JSON, you can pass it to python or nodejs and extract everything you need.

 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> will show the layers baked in the image. Unfortunately, docker history seems to be picked up by its formatting and the lack of options for choosing what is displayed.

You can select short and detailed formats using the -no-trunc flag.

 $ 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 

Here is a detailed example.

 docker history --no-trunc=true drpaulbrewer/spark-worker IMAGE CREATED CREATED BY SIZE 438ff4e1753a60779f389a3de593d41f7d24a61da6e1df76dded74a688febd64 2 weeks ago /bin/sh -c #(nop) CMD [/bin/sh -c /spark/my-spark-worker.sh] 0 B 6b664e29972481b8d6d47f98167f110609d9599f48001c3ca11c22364196c98a 2 weeks ago /bin/sh -c #(nop) ADD file:09da603c5f0dca7cc60f1911caf30c3c70df5e4783f7eb10468e70df66e2109f in /spark/ 296 B f6ae126ae124ca211c04a1257510930b37ea78425e31a273ea0b1495fa176c57 2 weeks ago /bin/sh -c #(nop) MAINTAINER drpaulbrewer@eaftc.com 0 B 70bcb3ffaec97a0d14e93b170ed70cc7d68c3c9dfb0222c1d360a300d6e05255 2 weeks ago /bin/sh -c #(nop) EXPOSE 2222/tcp 4040/tcp 6066/tcp 7077/tcp 7777/tcp 8080/tcp 8081/tcp 0 B 1332ac20384947fe1f15107213b675e5be36a68d72f0e81153d6d5a21acf35af 2 weeks ago /bin/sh -c apt-get update && apt-get --yes upgrade && apt-get --yes install sed nano curl wget openjdk-8-jdk scala && echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >>/etc/environment && export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m" && ./build/mvn -Phive -Phive-thriftserver -DskipTests clean package && chown -R spark:spark /spark && mkdir /var/run/sshd 1.481 GB 8e6f1e0bb1b0b9286947d3a4b443cc8099b00f9670aab1d58654051e06f62e51 2 weeks ago /bin/sh -c sed -e 's/archive.ubuntu.com/www.gtlib.gatech.edu\/pub/' /etc/apt/sources.list > /tmp/sources.list && mv /tmp/sources.list /etc/apt/sources.list 1.975 kB b3d242776b1f1f1ae5685471d06a91a68f92845ef6fc6445d831835cd55e5d0b 2 weeks ago /bin/sh -c #(nop) WORKDIR /spark/spark-1.3.1 0 B ac0d6cc5aa3fdc3b65fc0173f6775af283c3c395c8dae945cf23940435f2785d 2 weeks ago /bin/sh -c #(nop) ADD file:b6549e3d28e2d149c0bc84f69eb0beab16f62780fc4889bcc64cfc9ce9f762d6 in /spark/ 25.89 MB 6ee404a44b3fdd3ef3318dc10f3d002f1995eea238c78f4eeb9733d00bb29404 5 weeks ago /bin/sh -c #(nop) WORKDIR /spark 0 B c167faff18cfecedef30343ef1cb54aca45f4ef0478a3f6296746683f69d601b 5 weeks ago /bin/sh -c adduser --disabled-password --home /spark spark 335.1 kB f55d468318a4778733160d377c5d350dc8f593683009699c2af85244471b15a3 5 weeks ago /bin/sh -c #(nop) MAINTAINER drpaulbrewer@eaftc.com 0 B 19c8c047d0fe2de7239120f2b5c1a20bbbcb4d3eb9cbf0efa59ab27ab047377a 8 weeks ago /bin/sh -c #(nop) CMD [/bin/bash] 0 B c44d976a473f143937ef91449c73f2cabd109b540f6edf54facb9bc2b4fff136 8 weeks ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list 1.879 kB 14dbf1d35e2849a00c6c2628055030fa84b4fb55eaadbe0ecad8b82df65cc0db 8 weeks ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/policy-rc.d && echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl && sed -i 's/^exit.*/exit 0/' /sbin/initctl && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes 701 B afa7a164a0d215dbf45cd1aadad2a4d12b8e33fc890064568cc2ea6d42ef9b3c 8 weeks ago /bin/sh -c #(nop) ADD file:57f97478006b988c0c68e5bf82684372e427fd45f21cd7baf5d974d2cfb29e65 in / 131.5 MB 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 23 months ago 0 B 
+205
May 08 '15 at 22:29
source share

With docker 1.10, you now have new commands for data volume containers.
(for regular containers see the next section, for docker 1.8 +):




Since docker inspect -f '{{ .Volumes }}' containerid 1.8.1 (August 2015) a docker inspect -f '{{ .Volumes }}' containerid will be empty!

Now you need to check Mounts , which is a list of installed paths, such as:

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

If you need a path to the first mount (for example), it will be (using index 0):

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

Like Mike Mitterer comments below :

Enough print it all out:

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

Or, as Mitja commented , use the jq command .

 docker inspect -f '{{ json .Mounts }}' containerid | jq 
+83
Aug 13 '15 at 19:55
source share

Show names and mount points of volumes used by the container:

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

This is compatible with Docker 1.13.

+17
Feb 01 '17 at 8:29
source share

You can get information about which volumes were specially baked in the container by inspecting the container and looking at the JSON output and comparing a couple of fields. When launching docker inspect myContainer the Volumes and VolumesRW provide information about ALL volumes mounted inside the container, including volumes installed both in the Docker file, in the VOLUME directive and on the command line using the docker run -v . However, you can highlight which volumes were installed in the container using the docker run -v checking for the HostConfig.Binds field in the docker inspect JSON output. To clarify this HostConfig.Binds field, you will find out which volumes were specially installed in your docker run with the -v option. Therefore, if you cross-reference this field with the Volumes field, you can determine which volumes were baked in the container using the VOLUME directives in the Docker file.

The grep command can do the following:

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

BUT...

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

And in my example, you can see that I installed /var/docker/docker-registry/config in the container as /registry using the -v in my docker run , and I installed /data and /config volumes using the VOLUME directive in my Docker file. The container does not work to get this information, but it must be run at least once to populate the HostConfig JSON output of your docker inspect .

+8
May 08 '15 at 11:34
source share

For Docker 1.8, I use:

 $ docker inspect -f "{{ .Config.Volumes }}" 957d2dd1d4e8 map[/xmount/dvol.01:{}] $ 
+7
Oct 26 '15 at 6:07
source share

Here is one line for getting information about volumes for running containers:

 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 

Exit:

 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[] 

Version for dockers:

 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 
+6
May 05 '17 at 7:33 a.m.
source share

if you want to list all container names with the corresponding volumes attached to each container, you can try this:

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

Output Example:

/ opt_rundeck_1 [/ opt / var / lib / mysql: / var / lib / mysql: rw / Var / Library / Rundeck / var / storage: / Var / Library / Rundeck / var / storage: RW / opt / var / rundeck / .ssh: /var/lib/rundeck/.ssh: rw / opt / etc / rundeck: / etc / rundeck: rw / var / log / rundeck: / var / log / rundeck: rw / Opt / Rundeck -modules: / Opt / Rundeck-plugins: RW / Opt / var / Rundeck: / var / Rundeck: RW]

/ opt_rundeck_1 - container name

[..] - volumes attached to conatiner

+4
Oct 30 '17 at 12:01
source share

Useful change for users creating docker:

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

This will display collapsible volume information very carefully. Example from my 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 

The output contains one line for each container that lists volumes (and mount points). Modify the part {{.Name}}: {{.Destination}} to display the information you need.

If you need a simple list of volumes, one per line

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

Great for creating a list of volumes for backup. I use this method along with Blacklabelops Volumerize to backup all volumes used by all containers in docker. The documents for Volumerize do not call this, but you do not need to use it in a persistent container or use the built-in tools to start and stop services. I prefer to leave important operations, such as backup and maintenance, to the actual user (external docker). My backups are started by the actual (non-docker) user account and use stop-stop-stop to stop services, back up all volumes used and, finally, start the docker launch.

+3
Sep 28 '17 at 5:31 on
source share
 docker inspect -f '{{ json .Mounts }}' containerid | jq '.[]' 
+1
Jul 28 '16 at 16:04
source share

Here is my version to find docker mount points. Used to backup volumes.

  # 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 

This is a combination of previous solutions.

+1
May 12, '17 at 19:13
source share

If you use pwsh (powershell core), you can try

 (docker ps --format='{{json .}}' | ConvertFrom-Json).Mounts 
0
Jul 24 '19 at 12:51
source share



All Articles