web-dev-qa-db-fra.com

Monter un partage SMB/CIFS dans un conteneur Docker

J'ai une application Web s'exécutant dans un conteneur Docker. Cette application doit accéder à certains fichiers sur notre serveur de fichiers d'entreprise (Windows Server avec un contrôleur de domaine Active Directory). Les fichiers auxquels j'essaie d'accéder sont des fichiers images créés pour nos clients. L'application Web les affiche dans le portefeuille du client.

Sur ma machine de développement, les dossiers appropriés sont montés via des entrées dans /etc/fstab et les points de montage de l'hôte sont montés dans le conteneur Docker via l'argument --volume. Cela fonctionne parfaitement.

J'essaie maintenant de créer un conteneur de production qui sera exécuté sur un serveur différent et qui ne repose pas sur le partage CIFS monté sur l'hôte. J'ai donc essayé d'ajouter les entrées appropriées au fichier /etc/fstab dans le conteneur et de les monter avec mount -a. Je reçois mount error(13): Permission denied.

Une petite recherche en ligne m’a amené à cet article sur la sécurité Docker . Si je lis bien, il semble que Docker refuse explicitement la possibilité de monter des systèmes de fichiers dans un conteneur. J'ai essayé de monter les partages en lecture seule, mais cela (sans surprise) a également échoué.

Donc, j'ai deux questions:

  1. Ai-je raison de comprendre que Docker empêche toute utilisation de mount dans les conteneurs?

  2. Quelqu'un peut-il penser à un autre moyen d'accomplir ceci sans monter un partage CIFS sur l'hôte puis monter le dossier Hôte dans le conteneur Docker?

22
Kryten

Oui, Docker vous empêche de monter un volume distant dans le conteneur par mesure de sécurité. Si vous faites confiance à vos images et aux personnes qui les exécutent, vous pouvez utiliser l'indicateur --privileged avec docker run pour désactiver ces mesures de sécurité.

De plus, vous pouvez combiner --cap-add et --cap-drop pour ne donner au conteneur que les fonctionnalités dont il a réellement besoin. (Voir la documentation) La capacité SYS_ADMIN est celle qui accorde les privilèges de montage.

26
Nathaniel Waisbrot
  1. oui
  2. Il y a un problème fermé mount.cifs dans un conteneur

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

selon lequel l'ajout

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

avec les options run rendra mount -t cifs opérationnel.

Je l'ai essayé et:

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

dans le conteneur fonctionne alors

12
Wolfgang Fahl

Vous pouvez utiliser la commande smbclient (composant du package Samba) pour accéder au serveur SMB/CIFS à partir du conteneur Docker sans le monter, de la même manière que vous pouvez utiliser curl pour télécharger un fichier.

Il y a une question sur StackExchange Unix qui traite de cela, mais en bref:

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

Pour plusieurs fichiers, il existe l'option -T qui permet de créer ou d'extraire des archives .tar; toutefois, cela ressemble à un processus en deux étapes (une pour créer le .tar, puis une autre pour l'extraire localement). Je ne suis pas sûr que vous puissiez utiliser un tuyau pour le faire en une seule étape.

2
Malvineous

Vous pouvez utiliser un plug-in de volume de docker Netshare qui permet de monter CIFS/Samba à distance en tant que volumes.

0
andrey