Lors de l'utilisation d'images de docker à partir de registres, j'ai souvent besoin de voir les volumes créés par les conteneurs de l'image.
Remarque: j'utilise Docker version 1.3.2 sur Red Hat 7.
L'image officielle postgres
du registre Docker a un volume configuré pour les conteneurs à l'emplacement /var/lib/postgresql/data
.
Quelle est la commande la plus succincte pour afficher le volume sur /var/lib/postgresql/data
dans un conteneur postgres
?
Utilisez docker ps
pour obtenir l'identifiant du conteneur.
Alors docker inspect -f '{{ .Mounts }}' containerid
Exemple:
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]
Le résultat
map[/tmp:/tmp]
est, apparemment, due à l'utilisation du langage Go pour implémenter les outils de commande du menu fixe.
La commande docker inspect
sans le -f format
est assez détaillée. Puisqu'il s'agit de JSON, vous pouvez le diriger vers python ou nodejs et extraire tout ce dont vous avez besoin.
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>
affichera les calques incorporés dans une image. Malheureusement, docker history
semble gêné par sa mise en forme et le manque d'options pour choisir ce qui est affiché.
Vous pouvez choisir des formats laconiques et verbeux, via le drapeau --no-trunc.
$ 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
Voici un exemple détaillé.
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 [email protected] 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 [email protected] 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
Avec docker 1.10, vous avez maintenant de nouvelles commandes pour les conteneurs de volumes de données.
(pour les conteneurs normaux, voir la section suivante, pour le docker 1.8+):
Avec docker 1.8.1 (août 2015), un _docker inspect -f '{{ .Volumes }}' containerid
_ serait vide!
Vous devez maintenant vérifier Mounts
, qui est une liste de chemins montés comme:
_ "Mounts": [
{
"Name": "7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2",
"Source": "/mnt/sda1/var/lib/docker/volumes/7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2/_data",
"Destination": "/home/git/repositories",
"Driver": "local",
"Mode": "",
"RW": true
}
],
_
Si vous voulez le chemin du premier montage , par exemple, utilisez (en utilisant l'index 0):
_docker inspect -f '{{ (index .Mounts 0).Source }}' containerid
_
Comme Mike Mitterer commentaires ci-dessous :
Joli imprimer le tout:
_ docker inspect -f '{{ json .Mounts }}' containerid | python -m json.tool
_
Ou, comme commenté par Mitja , utilisez la commande jq
.
_docker inspect -f '{{ json .Mounts }}' containerid | jq
_
Afficher les noms et les points de montage des volumes utilisés par un conteneur:
docker container inspect \
-f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}' \
CONTAINER_ID_OR_NAME
Ceci est compatible avec Docker 1.13.
Vous pouvez obtenir des informations sur les volumes spécifiquement cuits dans le conteneur en inspectant le conteneur, en consultant la sortie JSON et en comparant quelques champs. Lorsque vous exécutez docker inspect myContainer
, les champs Volumes
et VolumesRW
vous fournissent des informations sur ALL des volumes montés dans un conteneur, y compris les volumes montés à la fois. Dockerfile avec la directive VOLUME
et sur la ligne de commande avec la commande docker run -v
. Toutefois, vous pouvez isoler les volumes montés dans le conteneur à l'aide de la commande docker run -v
en recherchant le champ HostConfig.Binds
dans la sortie docker inspect
JSON. Pour clarifier, ce champ HostConfig.Binds
vous indique quels volumes ont été montés spécifiquement dans votre commande docker run
avec l'option -v
. Ainsi, si vous croisez ce champ avec le champ Volumes
, vous pourrez déterminer quels volumes ont été cuits dans le conteneur à l'aide des directives VOLUME
du fichier Docker.
Un grep pourrait accomplir ceci comme:
$ docker inspect myContainer | grep -C2 Binds
...
"HostConfig": {
"Binds": [
"/var/docker/docker-registry/config:/registry"
],
Et...
$ docker inspect myContainer | grep -C3 -e "Volumes\":"
...
"Volumes": {
"/data": "/var/lib/docker...",
"/config": "/var/lib/docker...",
"/registry": "/var/docker/docker-registry/config"
Et dans mon exemple, vous pouvez voir que j'ai monté /var/docker/docker-registry/config
dans le conteneur en tant que /registry
à l'aide de l'option -v
de ma commande docker run
, et j'ai monté le /data
et /config
volumes à l'aide de la directive VOLUME
dans mon fichier Docker. Le conteneur ne fonctionne pas doit être en cours d'exécution pour obtenir ces informations, mais il doit avoir été exécuté au moins une fois pour renseigner la sortie HostConfig
JSON de votre docker inspect
commander.
Pour Docker 1.8, j'utilise:
$ docker inspect -f "{{ .Config.Volumes }}" 957d2dd1d4e8
map[/xmount/dvol.01:{}]
$
Voici une commande de ligne pour obtenir les informations de volume pour l'exécution de conteneurs:
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
La sortie est:
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 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
si vous voulez lister tous les conteneurs nommés avec les volumes pertinents attachés à chaque conteneur, vous pouvez essayer ceci:
docker ps -q | xargs docker container inspect -f '{{ .Name }} {{ .HostConfig.Binds }}'
exemple de sortie:
/ opt_rundeck_1 [/ opt/var/lib/mysql:/var/lib/mysql: rw/var/lib/rundeck/var/stockage:/var/lib/rundeck/var/stockage: 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-plugins:/opt/rundeck-plugins: rw/opt/var/rundeck:/var/rundeck: rw]
/ opt_rundeck_1 - nom du conteneur
[..] - volumes attachés au conatiner
Variation utile pour les utilisateurs docker-compos:
docker-compose ps -q | xargs docker container inspect \
-f '{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}'
Cela produira très proprement des informations sur le volume analysable. Exemple tiré de mon 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
La sortie contient une ligne pour chaque conteneur, répertoriant les volumes (et les points de montage) utilisés. Modifiez la partie {{.Name}}: {{.Destination}} pour afficher les informations souhaitées.
Si vous voulez juste une simple liste de volumes, un par ligne
$ docker-compose ps -q | xargs docker container inspect \
-f '{{ range .Mounts }}{{ .Name }} {{ end }}' \
| xargs -n 1 echo
core_wpdb
core_wpcode
core_wphtml
Idéal pour générer une liste de volumes à sauvegarder. J'utilise cette technique avec Blacklabelops Volumerize pour sauvegarder tous les volumes utilisés par tous les conteneurs d'un docker-compose. Les documents pour Volumerize ne l'appelent pas, mais vous n'avez pas besoin de l'utiliser dans un conteneur persistant ou d'utiliser les fonctionnalités intégrées pour le démarrage et l'arrêt des services. Je préfère laisser les opérations critiques telles que la sauvegarde et le contrôle des services à l'utilisateur réel (en dehors du menu fixe). Mes sauvegardes sont déclenchées par le compte utilisateur réel (non-docker) et utilisent docker-compose stop pour arrêter les services, sauvegarder tous les volumes utilisés et enfin docker-compose commencer à redémarrer.
Voici ma version pour trouver les points de montage d'un docker composé. À utiliser pour sauvegarder les 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
Ceci est une combinaison de solutions précédentes.
docker inspect -f '{{ json .Mounts }}' containerid | jq '.[]'
Si vous utilisez pwsh (Powershell Core), vous pouvez essayer
(docker ps --format='{{json .}}' | ConvertFrom-Json).Mounts
vous pouvez aussi voir le nom du conteneur et les montages comme ci-dessous
docker ps --format='{{json .}}' | ConvertFrom-Json | select Names,Mounts
La sortie étant convertie en json, vous pouvez obtenir toutes les propriétés dont elle dispose.