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 findmnt
y 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 unshare
y nsenter
para experimentar con espacios de nombres sin involucrar a Docker; por ejemplo, ejecutar unshare --mount --propagation=private
en una terminal, montar algo y luego ejecutarlo findmnt
para 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 shared
como 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 z
opción debería lograr algo similar, suponiendo que su sistema operativo host use SELinux, pero no lo probé.