name - dockers container download
¿Cómo se enumeran los volúmenes en los contenedores acoplables? (11)
Cuando uso imágenes de docker de registros, a menudo necesito ver los volúmenes creados por los contenedores de la imagen.
Nota: estoy usando docker versión 1.3.2 en Red Hat 7.
Ejemplo
La imagen oficial de
postgres
del Registro de Docker tiene un volumen configurado para contenedores en
/var/lib/postgresql/data
.
¿Cuál es el comando más sucinto para mostrar el volumen en
/var/lib/postgresql/data
en un contenedor de
postgres
?
Aquí está mi versión para encontrar puntos de montaje de una composición acoplable. En uso esto para hacer una copia de seguridad de los volúmenes.
# 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
Esta es una combinación de soluciones anteriores.
Aquí hay un comando de línea para obtener la información de volumen para ejecutar contenedores:
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
Salida es:
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[]
Versión de 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
Con docker 1.10, ahora tiene nuevos comandos para contenedores de volumen de datos.
(para contenedores regulares, consulte la siguiente sección, para Docker 1.8+):
Con docker 1.8.1 (agosto de 2015), un
docker inspect -f ''{{ .Volumes }}'' containerid
estaría
vacío.
Ahora debe verificar los
Mounts
, que es una lista de rutas montadas como:
"Mounts": [
{
"Name": "7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2",
"Source": "/mnt/sda1/var/lib/docker/volumes/7ced22ebb63b78823f71cf33f9a7e1915abe4595fcd4f067084f7c4e8cc1afa2/_data",
"Destination": "/home/git/repositories",
"Driver": "local",
"Mode": "",
"RW": true
}
],
Si desea la ruta del primer montaje (por ejemplo), sería (usando el índice 0):
docker inspect -f ''{{ (index .Mounts 0).Source }}'' containerid
Como Mike Mitterer comenta a below :
Bastante imprimir todo el asunto:
docker inspect -f ''{{ json .Mounts }}'' containerid | python -m json.tool
O, como
commented
Mitja
, use el
comando
jq
.
docker inspect -f ''{{ json .Mounts }}'' containerid | jq
Mostrar nombres y destinos de punto de montaje de volúmenes utilizados por un contenedor:
docker container inspect /
-f ''{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}'' /
CONTAINER_ID_OR_NAME
Esto es compatible con Docker 1.13.
Para Docker 1.8, uso:
$ docker inspect -f "{{ .Config.Volumes }}" 957d2dd1d4e8
map[/xmount/dvol.01:{}]
$
Puede obtener información sobre qué volúmenes se hornearon específicamente en el contenedor inspeccionando el contenedor y buscando en la salida JSON y comparando un par de campos.
Cuando ejecute
docker inspect myContainer
, los campos
Volumes
y
VolumesRW
brindan información sobre
TODOS
los volúmenes montados dentro de un contenedor, incluidos los volúmenes montados en Dockerfile con la directiva
VOLUME
y en la línea de comandos con el comando
docker run -v
.
Sin embargo, puede aislar qué volúmenes se montaron en el contenedor utilizando el comando
docker run -v
al verificar el campo
HostConfig.Binds
en la
HostConfig.Binds
docker inspect
salida JSON.
Para aclarar, este campo
HostConfig.Binds
le dice qué volúmenes se montaron específicamente en su comando de
docker run
con la opción
-v
.
Por lo tanto, si hace referencia cruzada de este campo con el campo
Volumes
, podrá determinar qué volúmenes se hornearon en el contenedor utilizando las directivas
VOLUME
en el Dockerfile.
Un grep podría lograr esto como:
$ docker inspect myContainer | grep -C2 Binds
...
"HostConfig": {
"Binds": [
"/var/docker/docker-registry/config:/registry"
],
Y...
$ docker inspect myContainer | grep -C3 -e "Volumes/":"
...
"Volumes": {
"/data": "/var/lib/docker...",
"/config": "/var/lib/docker...",
"/registry": "/var/docker/docker-registry/config"
Y en mi ejemplo, puede ver que he montado
/var/docker/docker-registry/config
en el contenedor como
/registry
usando la opción
-v
en mi comando
docker run
, y he montado
/data
y
/config
volúmenes usando la directiva
VOLUME
en mi Dockerfile.
No es
necesario que el contenedor
se
esté ejecutando para obtener esta información, pero se debe haber ejecutado al menos una vez para
HostConfig
salida JSON de
HostConfig
de su comando de
docker inspect
.
Si está utilizando pwsh (powershell core), puede intentar
(docker ps --format=''{{json .}}'' | ConvertFrom-Json).Mounts
También puede ver el nombre del contenedor y los montajes como se muestra a continuación
docker ps --format=''{{json .}}'' | ConvertFrom-Json | select Names,Mounts
Como la salida se convierte como json, puede obtener cualquier propiedad que tenga.
Use
docker ps
para obtener la identificación del contenedor.
Luego,
docker inspect -f ''{{ .Mounts }}'' containerid
Ejemplo:
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]
La salida
map[/tmp:/tmp]
aparentemente, se debe al uso del lenguaje Go para implementar las herramientas de comando de docker.
El comando de
docker inspect
sin el
-f format
es bastante detallado.
Dado que es JSON, puede canalizarlo a python o nodejs y extraer lo que necesite.
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>
mostrará las capas cocidas en una imagen.
Desafortunadamente, el
docker history
Docker parece obstaculizado por su formato y la falta de opciones para elegir lo que se muestra.
Puede elegir formatos concisos y detallados, a través del indicador --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
Aquí hay un ejemplo detallado.
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
Variación útil para usuarios de docker-compose:
docker-compose ps -q | xargs docker container inspect /
-f ''{{ range .Mounts }}{{ .Name }}:{{ .Destination }} {{ end }}''
Esto generará de manera muy clara información de volumen analizable. Ejemplo de mi 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 salida contiene una línea para cada contenedor, que enumera los volúmenes (y puntos de montaje) utilizados. Modifique la porción {{.Name}}: {{.Destination}} para generar la información que desea.
Si solo desea una lista simple de volúmenes, uno por línea
$ docker-compose ps -q | xargs docker container inspect /
-f ''{{ range .Mounts }}{{ .Name }} {{ end }}'' /
| xargs -n 1 echo
core_wpdb
core_wpcode
core_wphtml
Genial para generar una lista de volúmenes para respaldar. Utilizo esta técnica junto con Blacklabelops Volumerize para hacer una copia de seguridad de todos los volúmenes utilizados por todos los contenedores dentro de un docker-compose. Los documentos para Volumerize no lo mencionan, pero no necesita usarlo en un contenedor persistente o usar las instalaciones incorporadas para iniciar y detener servicios. Prefiero dejar las operaciones críticas como la copia de seguridad y el control del servicio al usuario real (fuera de la ventana acoplable). Mis copias de seguridad son activadas por la cuenta de usuario real (no acoplable), y uso docker-compose stop para detener los servicios, copia de seguridad de todos los volúmenes en uso y finalmente docker-compose start para reiniciar.
si desea enumerar todos los nombres de los contenedores con los volúmenes relevantes que se adjuntaron a cada contenedor, puede intentar esto:
docker ps -q | xargs docker container inspect -f ''{{ .Name }} {{ .HostConfig.Binds }}''
salida de ejemplo:
/ opt_rundeck_1 [/ opt / var / lib / mysql: / var / lib / mysql: rw / var / lib / rundeck / var / storage: / var / lib / 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-plugins: / opt / rundeck-plugins: rw / opt / var / rundeck: / var / rundeck: rw]
/ opt_rundeck_1: nombre del contenedor
[..] - volúmenes unidos al contenedor
docker inspect -f ''{{ json .Mounts }}'' containerid | jq ''.[]''