
Ich versuche, meine Docker-Konfiguration, Bilder, Container usw. auf einem externen Speicher zu speichern. Nach diesem Tutorial https://www.howtogeek.com/devops/how-to-store-docker-images-and-containers-on-an-external-drive/
Ich habe /etc/docker/daemon.json erstellt:
{
"data-root": "/media/user/MYUSB/docker-data"
}
Aber wenn ich meinen USB-Speicher (MYUSB) anschließe und den Docker-Dienst starte, schlägt dieser fehl.
$ sudo service docker start
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
$ sudo dockerd --debug
INFO[2023-07-06T12:36:29.650356567+02:00] Starting up
could not create or set daemon root permissions: /media/user/MYUSB/docker-data: chown /media/user/MYUSB/docker-data: operation not permitted
Und wenn ich den Computer neu starte, erstellt der Dienst stattdessen einen neuen, sauberen MYSUB-Ordner zum Speichern der Daten und das System mountet meinen aktuellen USB-Speicher als MYUSB1 (und verwendet ihn nicht zum Speichern der Docker-Daten).
Mein System mountet meinen USB-Stick und die Berechtigungen sind auf Benutzer:Benutzer und nicht auf Root:Root eingestellt, also kommt es vielleicht daher. Aber ich finde es merkwürdig, dass der Docker-Dienst (der vermutlich von Root ausgeführt wird) keinen Benutzer:Benutzer-Speicher verwenden kann.
Wenn ich versuche, den USB-Stick manuell als Root-Benutzer zu mounten, ist der Ordner /media/user/MYUSB, den ich erstelle, auf root:root eingestellt, bis ich den USB-Stick darin mounte: sein Besitzer ändert sich zu user:user.
Ich bin etwas verunsichert, da ich anscheinend der Einzige im Internet bin, der auf dieses Problem gestoßen ist, obwohl es sich anscheinend nicht um eine ungewöhnliche Konfiguration handelt.
Antwort1
Aus einigen Versuchen schließe ich, dass Ihr USB-Stick FAT32 oder ein anderes Dateisystem hat, das keine POSIX-Berechtigungen unterstützt. Sie können ein solches Dateisystem nicht mit Docker verwenden. Aber das ist noch nicht alles!
Automatisch gemountete Dateisysteme sind auch nicht für Docker geeignet, da sie mitnosuidUndKnoten. Ein Linux-Root-Dateisystem (das normalerweise in Docker-Images enthalten ist) kann nicht ordnungsgemäß darauf abgelegt werden. Sie können dies mit überprüfen mount | grep media
. (Das automatische Einhängen funktioniert normalerweise mitudisks2heutzutage.)
Zuerst sollten Sie ein geeignetes Dateisystem auf Ihrem Flash-Laufwerk installieren (wieext4).
Dann müssen Sie sicherstellen, dassudisks2mountet das Dateisystem nicht (mit ungeeigneten Optionen und zu spät). Sie können einudevRegel, um das Dateisystem zu ignorieren:
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"
Sie würden dies in eine Datei mit dem Namen wie einfügen /etc/udev/rules.d/99-ignore-my-usb.rules
. Sie können die Dateisystem-UUID für Ihr neu erstelltes Dateisystem mithilfe von finden blkid
.
Sie würden dann einen entsprechenden Eintrag in erstellen /etc/fstab
(wiederum unter Verwendung der UUID), um sicherzustellen, dass der USB-Stick früh genug gemountet wird. Sie müssen auch nicht an der Docker-Konfiguration herumfummeln, mounten Sie ihn einfach unter /var/lib/docker
, dem Standard-Docker-Datenverzeichnis. Etwa so:
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX /var/lib/docker ext4 relatime 0 0
Um sicherzustellen, dass alles einwandfrei funktioniert, führen Sie einfach einen Neustart durch. Docker sollte starten und mount
bestätigen, dass das Flash-Laufwerk tatsächlich unter gemountet ist /var/lib/docker
.
Ihr Docker-Flash-Laufwerk ist dann portabel – gewissermaßen. Sie dürfen es nicht einfach entfernen, wenn der PC läuft. Stoppen Sie Docker zuerst, hängen Sie es aus und entfernen Sie es erst dann. Andernfalls riskieren Sie eine Beschädigung des Dateisystems und Docker würde natürlich irgendwann abstürzen.