it-swarm.com.de

Mounten Sie die SMB/CIFS-Freigabe in einem Docker-Container

Ich habe eine Webanwendung, die in einem Docker-Container ausgeführt wird. Diese Anwendung muss auf einige Dateien auf unserem Unternehmensdateiserver (Windows Server mit einem Active Directory-Domänencontroller) zugreifen. Die Dateien, auf die ich zugreifen möchte, sind Bilddateien, die für unsere Kunden erstellt wurden, und die Webanwendung zeigt sie als Teil des Kundenportfolios an.

Auf meinem Entwicklungscomputer habe ich die entsprechenden Ordner über Einträge in /etc/fstab eingehängt, und die Host-Mountpunkte werden über das Argument --volume im Docker-Container eingehängt. Das funktioniert perfekt.

Jetzt versuche ich, einen Produktionscontainer zusammenzustellen, der auf einem anderen Server ausgeführt wird und der nicht darauf angewiesen ist, dass die CIFS-Freigabe auf dem Host eingehängt ist. Also habe ich versucht, die entsprechenden Einträge zur /etc/fstab-Datei im Container hinzuzufügen und sie mit mount -a zu mounten. Ich bekomme mount error(13): Permission denied.

Eine kleine Online-Recherche führte mich zu diesem Artikel über die Docker-Sicherheit . Wenn ich dies richtig lese, scheint Docker ausdrücklich die Möglichkeit zu unterdrücken, Dateisysteme in einem Container bereitzustellen. Ich habe versucht, die Freigaben schreibgeschützt zu montieren, was jedoch (nicht überraschend) auch fehlgeschlagen ist.

Ich habe also zwei Fragen:

  1. Verstehe ich, dass Docker die Verwendung von mount in Containern verhindert?

  2. Kann sich jemand eine andere Möglichkeit vorstellen, um dies zu erreichen ohne eine CIFS-Freigabe auf dem Host bereitzustellen und dann den Hostordner im Docker-Container anzuhängen?

22
Kryten

Ja, Docker verhindert aus Sicherheitsgründen, dass Sie ein Remote-Volume im Container anbringen. Wenn Sie Ihren Bildern und den Personen, die sie betreiben, vertrauen, können Sie das --privileged-Flag mit docker run verwenden, um diese Sicherheitsmaßnahmen zu deaktivieren.

Außerdem können Sie --cap-add und --cap-drop kombinieren, um dem Container nur die Funktionen zu geben, die er tatsächlich benötigt. (Siehe Dokumentation) Die SYS_ADMIN-Funktion gewährt Mountprivilegien.

26
  1. ja
  2. Es gibt eine geschlossene Ausgabe mount.cifs in einem Container.

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

nach welchem ​​addieren

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

mit den Laufoptionen werden mount -t-cifs funktionsfähig.

Ich habe es ausprobiert und:

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

innerhalb des Containers funktioniert dann

12
Wolfgang Fahl

Sie können den Befehl smbclient (Teil des Samba-Pakets) verwenden, um vom Docker-Container aus auf den SMB/CIFS-Server zuzugreifen, ohne ihn zu mounten, und zwar auf dieselbe Weise, wie Sie curl zum Herunterladen oder Hochladen einer Datei verwenden.

Es gibt eine Frage zu StackExchange Unix , die sich damit befasst, aber kurz:

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

Für mehrere Dateien gibt es die Option -T, mit der .tar-Archive erstellt oder extrahiert werden können. Dies scheint jedoch ein zweistufiger Prozess zu sein (einer zum Erstellen des .tars und eines weiteren zum lokalen Extrahieren). Ich bin nicht sicher, ob Sie eine Pfeife in einem Schritt verwenden könnten.

2
Malvineous

Sie können ein Netshare Docker-Volume-Plugin verwenden, mit dem Remote-CIFS/Samba als Volumes gemountet werden kann.

0
andrey

Machen Sie Ihre Container nicht unsicherer, indem Sie viele Ports freigeben, nur um eine Freigabe bereitzustellen. Oder indem Sie es als --privileged Ausführen.

So habe ich dieses Problem gelöst:

  • Stellen Sie zuerst das Volume auf dem Server bereit, auf dem Docker ausgeführt wird.

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

Ändern Sie hier den Benutzernamen, den SERVER und WinShare. Daraufhin werden Sie nach Ihrem Sudo-Kennwort und anschließend nach dem Kennwort für die Remote-Freigabe gefragt.

Angenommen, Sie haben den Ordner WinShare in Ihrem Basisordner erstellt. Nachdem Sie diesen Befehl ausgeführt haben, sollten Sie in der Lage sein, alle freigegebenen Ordner und Dateien im Ordner WinShare anzuzeigen. Da Sie außerdem die Tags uid und gid verwenden, haben Sie die ganze Zeit über Schreibzugriff, ohne Sudo zu verwenden.

  • Jetzt können Sie Ihren Container mit dem Tag -v Ausführen und ein Volume zwischen dem Server und dem Container freigeben.

Nehmen wir an, Sie haben es wie folgt ausgeführt.

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

Sie sollten jetzt in der Lage sein, auf die Windows-Freigabe zuzugreifen und sie von Ihrem Container aus zu ändern.

Um es zu testen, mache einfach:

docker exec -it yourRunningContainer /bin/bash

cd /Home

touch testdocfromcontainer.txt

Sie sollten testdocfromcontainer.txt In der Windows-Freigabe sehen.

0
nPcomp