Montar sistema de ficheros en contenedor Docker activo

Cuando usamos la opción -v de docker run, se hace un «bind mount» de la ruta indicada, con lo cual, de los sistemas de ficheros que estén montados por debajo de esa ruta, solo aparecerán dentro del contenedor los que estuvieran montados antes de ejecutar docker run.

A veces nos interesará incorporar dinámicamente sistemas de ficheros después de que se active el contenedor. Por ejemplo, para que sistemas de ficheros que se han montado a posteriori por debajo de la ruta «bind-mount-eada» aparezcan dentro del contenedor. A continuación resumo los pasos para conseguirlo en dos casos particulares: montar un volumen LVM y montar un recurso de red exportado por NFS (versión 4).

Instalar nsenter (incluido en las versiones recientes de util-linux) en el «docker host» (el servidor donde se crean los contenedores)

cd /usr/local/src/
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.26/util-linux-2.26.2.tar.xz
tar xvfJ util-linux-2.26.2.tar.xz 
cd util-linux-2.26.2/
./configure
make -j 4 LDFLAGS=-all-static nsenter
cp nsenter /usr/local/sbin/

Averiguar el PID del contenedor en el cual queremos montar el sistema de ficheros

docker inspect --format "{{.State.Pid}}" CONTENEDOR
# PID

Obtener (en hexadecimal) los números del «dispositivo de bloque» correspondiente al sistema de ficheros

# nombre simbólico del volumen
ls -l /dev/mapper/NOMBRE_VG-NOMBRE_LV
# /dev/dm-XX
stat --format "0x%t 0x%T" /dev/dm-XX
# 0xab 0xcd

Replicar dentro del contenedor el fichero de dispositivo y el enlace

mknod --mode 0600 /dev/dm-XX b 0xab 0xcd
ln -s /dev/dm-XX  /dev/mapper/NOMBRE_VG-NOMBRE_LV
mkdir /mnt/tmp

Montar el sistema de ficheros con la ayuda de nsenter (ya que por defecto, desde dentro del contenedor «no tenemos permiso», por razones de seguridad)

# Desde el docker host
nsenter --target PID --mount --uts --ipc --net --pid -- mount /dev/dm-XX /mnt/tmp

Si el sistema de ficheros que queremos montar es NFS, no hace falta la parte de replicar el fichero de dispositivo. Basta con que nfs-utils esté instalado en el contenedor.

# Desde el docker host
nsenter --target PID --mount --uts --ipc --net --pid -- mount -t nfs SERVIDOR_NFS:/RUTA/EXPORTADA  /RUTA/DESTINO/DENTRO/CONTENEDOR

Inspirado por el artículo sobre montaje dinámico de volúmenes en Docker de Jérôme Petazzoni

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *