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