el enlace de montaje dentro del contenedor no refleja el contenedor exterior

el enlace de montaje dentro del contenedor no refleja el contenedor exterior

Estoy intentando vincular el directorio del host a algún directorio dentro del contenedor y espero que los cambios realizados dentro del contenedor se reflejen en el host.

Aquí están los pasos que he seguido.

creó /hostdir en el host y ejecutó el contenedor ubuntu en modo privilegiado

[root@nhbdlin03 ~]# mkdir /hostdir
[root@nhbdlin03 ~]# docker run -itd --privileged --name ubuntu -v /hostdir:/hostdir:z ubuntu
76aebded33274e95a6f569d0831aee4df27e9f200a8fd0401448239bd6f5bf80
[root@nhbdlin03 ~]# docker exec -it ubuntu bash

creando un contenedor_dir dentro del contenedor

root@76aebded3327:/# mkdir /container_dir

vinculando los dos directorios (exitoso)

root@76aebded3327:/# mount --bind /container_dir /hostdir

creando un archivo llamado hello.txt dentro de /container_dir

root@76aebded3327:/# cd container_dir/
root@76aebded3327:/container_dir# touch hello.txt

se refleja dentro de /hostdir ya que está vinculado al montaje en /container_dir

root@76aebded3327:/container_dir# ls /hostdir/
hello.txt

salir del contenedor y verificar el host, se refleja lo mismo

root@76aebded3327:/container_dir# exit

[root@nhbdlin03 ~]# ls /hostdir/
[root@nhbdlin03 ~]# ls /hostdir/ | wc -l
0
[root@nhbdlin03 ~]#

el contenido no se refleja.
Me estoy perdiendo algo o lo estoy haciendo completamente mal, ayúdenme en la dirección correcta.

Respuesta1

Esto es así por diseño: los montajes realizados dentro de un contenedor no son visibles en el exterior, por varias razones.

El contenedor se ejecuta en un espacio de nombres de montaje separado (no solo un simple chroot), y lo más probable es que Docker configure el nuevo espacio de nombres en modo "privado", en parte para evitar que los diversos montajes del contenedor saturan el servidor del host findmnty en parte para facilitar su desmontaje. todos los montajes cuando el contenedor sale.

(Cuando todos los montajes sólo son visibles desde el interior del espacio de nombres, es suficiente con eliminar todos los procesos; entonces el núcleo eliminará automáticamente los montajes. Pero si algunos de ellos son visibles externamente, entonces un proceso de 'sistema operativo anfitrión' podría potencialmente detener "en uso".)

Es posible que necesite algo como mount --make-[r]shared /en el momento correcto para que los soportes internos sean visibles externamente. No tengo una respuesta más precisa en este momento.

Puede usar las herramientas unsharey nsenterpara experimentar con espacios de nombres sin involucrar a Docker; por ejemplo, ejecutar unshare --mount --propagation=privateen una terminal, montar algo y luego ejecutarlo findmntpara verlo reportando diferentes resultados "dentro" y "fuera" del proceso de "dejar de compartir".

Respuesta2

Lo que funcionó para mí fue hacer que Docker se vincule sharedcomo se explica enesta respuestaa una pregunta similar "¿Cómo exponer el punto de montaje de un contenedor al host?":

-v /hostdir:/hostdir:shared

De acuerdo adocumentos de Dockerla zopción debería lograr algo similar, suponiendo que su sistema operativo host use SELinux, pero no lo probé.

información relacionada