Montar el contenido del contenedor Docker en el sistema de archivos host

24

Quiero poder inspeccionar el contenido de un contenedor Docker (solo lectura). Una forma elegante de hacerlo sería montar el contenido del contenedor en un directorio. Estoy hablando de montar el contenido de un contenedor en el host, no de montar una carpeta en el host dentro de un contenedor.

Puedo ver que hay dos controladores de almacenamiento en Docker en este momento: aufs y btrfs. Mi propia instalación de Docker usa btrfs, y navegar a / var / lib / docker / btrfs / subvolumes me muestra un directorio por contenedor Docker en el sistema. Sin embargo, este es un detalle de implementación de Docker y se siente mal montarlo; enlaza estos directorios en otro lugar.

¿Hay una manera adecuada de hacer esto, o necesito parchear Docker para admitir este tipo de monturas?

dflemstr
fuente
¿Por qué sería un error atar estos en otro lugar?
Michael Hampton
1
Porque la ubicación de almacenamiento es un detalle de implementación. El día que la ventana acoplable agrega otro controlador de almacenamiento, la ubicación se moverá. Necesito hacer esto semiautomático y sería bueno usar API públicas por ese motivo.
dflemstr
2
Puede valer la pena considerar trabajar sobre nsenter (o docker-enter) para lograr sus objetivos; Por supuesto, existe la restricción de tener que cambiar el código / herramientas de inspección dentro del contenedor.
VladFr
¿No hay forma de instruir a Linux para que se monte a través de un borde de contenedor?
dflemstr
@dflemstr sí, hay, --volumes-from kinda hace eso, parece montar una unión del directorio desde la imagen base del otro contenedor y el volumen, pero este comportamiento no está documentado afaik
Tarnay Kálmán

Respuestas:

10

Echa un vistazo a docker export.

Para listar rápidamente los archivos en su contenedor:

docker export CONTAINER|tar -t

Exportar:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

O para mirar un archivo:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 admite cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

actualización: debe ejecutar ssh en su máquina acoplable cuando ejecute esto.

laktak
fuente
2
Mis imágenes son bastante grandes (muchos cientos de MiB), por lo que hacer esto para recuperar archivos individuales es una sobrecarga. Creará el archivo de varios cientos de megabytes cada vez.
dflemstr
@dflemstr usa la línea con tar x PATH-IN-CONTAINER, solo extraerá los archivos que necesita.
laktak
... pero todo el tararchivo todavía se crea en el demonio Docker, y toma varios minutos crearlo ...
dflemstr
@dflemstr no está seguro de cuál es su configuración pero, por ejemplo, me docker export ubuntu|tar -t|grep etc/networklleva 3 segundos.
laktak
Es probable que esté en ejecución que en la misma máquina que el demonio acoplable por lo que no necesita hacer una transferencia a la red, y la ubuntuimagen es muy pequeña ...
dflemstr
3

Puede usar docker commit para mantener el estado actual de su contenedor en una nueva imagen, y comenzar un contenedor interactivo desde esta imagen para inspeccionar el contenido.

De la documentación:

Puede ser útil confirmar los cambios o la configuración del archivo de un contenedor en una nueva imagen. Esto le permite depurar un contenedor ejecutando un shell interactivo o exportar un conjunto de datos que funcione a otro servidor.

Espero que esto ayude.

Eric Citaire
fuente
2

Puede usar nsenter para ejecutar su programa de inspección (que probablemente ya debe estar incluido en el contenedor) dentro de un contenedor / espacio de nombres. Pero para montar el sistema de archivos contenedor como se ve dentro de él, debe montar la imagen original y todas las capas si es aufs, o la acción equivalente para el mapeador de dispositivos, btrfs y los otros (futuros) motores de almacenamiento utilizados, diferentes en cada caso. Probablemente sería más eficiente dejar que Docker haga el trabajo por usted, exactamente como se supone que debe hacer, y usar nsenter para hacer la inspección dentro del contenedor.

Hay otros enfoques. docker diff mostrará qué archivos cambiaron en ese contenedor, si desea ver qué cambió en lugar de lo que estaba en la imagen original.

Y para los datos que deben ser persistentes e inspeccionables, probablemente un mejor patrón sería tenerlo en un volumen en el contenedor, y tenerlo montado en el sistema de archivos real, o en un contenedor de datos puro, o en el mismo contenedor, pero que puede iniciar otro contenedor con el programa de inspección montando esos volúmenes desde él.

gmuslera
fuente
1

EDITAR: probé la solución a continuación y desafortunadamente no funcionó bien para mí en la práctica. El sistema de archivos montado no reflejaba con precisión el sistema de archivos del contenedor (incluso con cache=no). No estoy seguro si este es un problema fundamental o si estoy haciendo algo mal.

Puede instalar sshd en la imagen del acoplador y usarlo docker execpara ejecutar un servicio ssh ( /usr/sbin/sshd -D) en el contenedor del acoplador (tenga en cuenta que el puerto SSH 22 del contenedor del acoplador debe estar expuesto).

Luego, use docker cppara copiar su clave ssh pública en el /root/.ssh/authorized_keysdirectorio del contenedor docker.

Finalmente, use docker inspectpara encontrar la dirección IP del contenedor y monte el sistema de archivos del contenedor usando

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Tendría que escribir un guión para que esto funcione cómodamente en la práctica.

mnieber
fuente