Considere el siguiente contenedor Docker:
docker run --rm -it -v /tmp:/mnt/tmp alpine sh
Esto monta el directorio host / tmp en / mnt / tmp dentro del contenedor alpino.
Ahora, en el sistema host, monte un volumen NFS en el directorio / tmp:
mkdir /tmp/nfs
mount -t nfs4 192.168.1.100:/data /tmp/nfs
El montaje funciona en el sistema host y veo lo siguiente:
# ls /tmp/nfs
file1 file2 file3
#
Pero en el Docker Container, veo un directorio en blanco:
# ls /mnt/tmp/nfs
#
Sé que puedo evitar esto haciendo el montaje directamente en el Contenedor Docker. Pero estoy realmente interesado en saber por qué el montaje funciona en el contenedor host pero no en el contenedor acoplable.
Respuestas:
Esto sucede porque el volumen está utilizando la
private
propagación de montaje. Esto significa que una vez que ocurre la montura, cualquier cambio que ocurra en el lado de origen (por ejemplo, el lado "host" en el caso de Docker) no será visible debajo de la montura.Hay un par de formas de manejar esto:
Primero monte el NFS, luego inicie el contenedor. La montura se propagará al contenedor, sin embargo, como antes, el contenedor no verá ningún cambio en la montura (incluidos los desmontes).
Utilice la propagación "esclava". Esto significa que una vez que se crea el montaje, cualquier cambio en el lado de origen (host acoplable) podrá verse en el destino (en el contenedor). Si estás haciendo monturas anidadas, querrás usar
rslave
(r
para recursivo).También hay propagación "compartida". Este modo haría cambios en el punto de montaje desde el interior del contenedor propagado al host, así como al revés. Dado que su usuario ni siquiera tendría privilegios para realizar tales cambios (a menos que agregue CAP_SYS_ADMIN), probablemente esto no sea lo que desea.
Puede configurar el modo de propagación al crear el montaje de esta manera:
La otra alternativa sería usar un volumen en lugar de un montaje de host. Puedes hacer esto así:
Esto asegurará que siempre se monte en el contenedor por usted, no dependa de tener la configuración del host de alguna manera específica o de lidiar con la propagación del montaje.
nota :
:
se requiere la parte frontal de la ruta del dispositivo, algo extraño en el módulo del kernel nfs.nota : Docker actualmente no se resuelve a
<nfs host>
partir de un nombre DNS (lo hará en 1.13), por lo que deberá proporcionar la dirección IP aquí.Más detalles sobre los montajes de "subárbol compartido": https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
fuente
Habilite la propagación de montaje compartido en el volumen agregando el indicador: shared al final del argumento de volumen:
Si Docker se instaló a través de un administrador de paquetes o script de instalación para systemd, es posible que deba ajustar el argumento del demonio MountFlags. Para hacerlo, busque el archivo docker.service:
En mi caso en Ubuntu 16.04, estaba ubicado en /etc/systemd/system/multi-user.target.wants/docker.service. Edite este archivo con vi o nano, y asegúrese de que la opción MountFlags lea:
Guarde el archivo, vuelva a cargar los argumentos del demonio y reinicie la ventana acoplable:
Ahora debería poder establecer el indicador de propagación de montaje compartido en los volúmenes cuando use "docker run".
fuente
A partir de Docker 17.06, puede montar recursos compartidos NFS en el contenedor directamente cuando lo ejecuta, sin la necesidad de capacidades adicionales
Alternativamente, puede crear el volumen antes del contenedor:
Obtuve la pista de https://github.com/moby/moby/issues/28809
fuente