tutorial run que hub espaƱol desde create cero linux windows docker mount cifs

linux - run - Monte el recurso compartido SMB/CIFS dentro de un contenedor Docker



que es docker hub (5)

Tengo una aplicación web ejecutándose en un contenedor Docker. Esta aplicación necesita acceder a algunos archivos en nuestro servidor de archivos corporativo (Windows Server con un controlador de dominio de Active Directory). Los archivos a los que intento acceder son archivos de imagen creados para nuestros clientes y la aplicación web los muestra como parte de la cartera del cliente.

En mi máquina de desarrollo tengo las carpetas apropiadas montadas a través de entradas en /etc/fstab y los puntos de montaje del host están montados en el contenedor Docker a través del argumento --volume . Esto funciona a la perfección.

Ahora estoy tratando de armar un contenedor de producción que se ejecutará en un servidor diferente y que no dependa de que el recurso compartido CIFS se monte en el host. Así que intenté agregar las entradas apropiadas al /etc/fstab en el contenedor y montarlas con mount -a . Me sale mount error(13): Permission denied .

Una pequeña investigación en línea me llevó a este artículo sobre la seguridad de Docker . Si estoy leyendo esto correctamente, parece que Docker niega explícitamente la capacidad de montar sistemas de archivos dentro de un contenedor. Intenté montar las acciones de solo lectura, pero esto (como era de esperar) también falló.

Entonces, tengo dos preguntas:

  1. ¿Estoy en lo cierto al entender que Docker impide el uso de mount dentro de contenedores?

  2. ¿Alguien puede pensar en otra forma de lograr esto sin montar un recurso compartido CIFS en el host y luego montar la carpeta del host en el contenedor Docker?


  1. si
  2. Hay un problema cerrado mount.cifs dentro de un contenedor

https://github.com/docker/docker/issues/22197

de acuerdo con el cual agregar

--cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH

a las opciones de ejecución hará que mount -t cifs sea operativo.

Lo probé y:

mount -t cifs //<host>/<path> /<localpath> -o user=<user>,password=<user>

dentro del contenedor entonces funciona


No haga que sus contenedores sean menos seguros exponiendo muchos puertos solo para montar un recurso compartido. O ejecutándolo como --privileged

Así es como resolví este problema:

  • Primero monte el volumen en el servidor que ejecuta docker.

sudo mount -t cifs -o username=YourUserName,uid=$(id -u),gid=$(id -g) //SERVER/share ~/WinShare

Cambie el nombre de usuario, el SERVIDOR y WinShare aquí. Esto le pedirá su contraseña de sudo, luego le pedirá una contraseña para el recurso compartido remoto.

Supongamos que creó la carpeta WinShare dentro de su carpeta de inicio. Después de ejecutar este comando, debería poder ver todas las carpetas y archivos compartidos en la carpeta WinShare . Además de eso, ya que usa las etiquetas uid y gid , tendrá acceso de escritura sin usar sudo todo el tiempo.

  • Ahora puede ejecutar su contenedor utilizando la etiqueta -v y compartir un volumen entre el servidor y el contenedor.

Digamos que lo ejecutó de la siguiente manera.

docker run -d --name mycontainer -v /home/WinShare:/home 2d244422164

Debería poder acceder al recurso compartido de Windows y modificarlo desde su contenedor ahora.

Para probarlo solo haz:

docker exec -it yourRunningContainer /bin/bash

cd /Home

touch testdocfromcontainer.txt

Debería ver testdocfromcontainer.txt en el testdocfromcontainer.txt compartido de Windows.


Puede usar el comando smbclient (parte del paquete Samba) para acceder al servidor SMB / CIFS desde el contenedor Docker sin montarlo, de la misma manera que puede usar curl para descargar o cargar un archivo.

Hay una pregunta sobre StackExchange Unix que se ocupa de esto, pero en resumen:

smbclient //server/share -c ''cd /path/to/file; put myfile''

Para múltiples archivos existe la opción -T que puede crear o extraer archivos .tar , sin embargo, parece que sería un proceso de dos pasos (uno para crear el .tar y luego otro para extraerlo localmente). No estoy seguro de si podría usar una tubería para hacerlo en un solo paso.



Sí, Docker le impide montar un volumen remoto dentro del contenedor como medida de seguridad. Si confía en sus imágenes y en las personas que las ejecutan, puede usar el indicador --privileged con --privileged docker run para deshabilitar estas medidas de seguridad.

Además, puede combinar --cap-add y --cap-drop para darle al contenedor solo las capacidades que realmente necesita. (Ver documentación) La capacidad SYS_ADMIN es la que otorga privilegios de montaje.