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:
Verstehe ich, dass Docker die Verwendung von mount
in Containern verhindert?
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?
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.
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
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 .tar
s und eines weiteren zum lokalen Extrahieren). Ich bin nicht sicher, ob Sie eine Pfeife in einem Schritt verwenden könnten.
Sie können ein Netshare Docker-Volume-Plugin verwenden, mit dem Remote-CIFS/Samba als Volumes gemountet werden kann.
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:
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.
-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.