2016-04-27 12 views
3

Ich habe udev-Regeln geschrieben, um SYMLINKS zu erstellen, wenn ein Gerät verbunden ist. Die Regeln funktionieren auf dem Hostcomputer einwandfrei, aber wenn ich einen Container mit den gleichen Regeln in /etc/udev/rules.d starte, funktionieren sie nicht in meinem Container.Warum funktionieren meine udev-Regeln nicht in einem aktiven Docker-Container?

Ich versuche zu erkennen, wenn ein externes Laufwerk angeschlossen ist und einen entsprechenden Symlink erstellen./dev/sdX wird beim Start des Containers erstellt, wenn das Laufwerk zum Zeitpunkt docker run vorhanden war, aber nach dem run-Befehl nicht angezeigt wird und auch nicht verschwindet, wenn das Laufwerk entfernt wird.

Hier ist ein Beispiel-Regel, die gerade fein auf der Host-Maschine funktioniert:

KERNEL=="sd?", SYMLINK+="test_%k"

+0

Würden Sie bitte posten, welche Art von Gerät Sie handhaben möchten und wie Ihre Regeln aussehen? –

Antwort

4

Ich habe es herausgefunden. Was ich im Internet getan gesehen ist der Host-/dev im Inneren des Behälters zu montieren:

docker run -v=/dev:/dev(Anmerkung: nicht sicher)

Aber das ist sehr gefährlich und so ziemlich den Host-Computer zerstört durch Ausmisten mit Berechtigungen (zB psuedo-terminals können nicht erzeugt werden).

Wenn jedoch ich eine udev-Regel auf dem Host-Rechner bis zu Geräten in einem einzigartigen Unterverzeichnis zu erstellen, wie /dev/foo/sdX, kann ich dann teile nur dev/foo mit meinem Container:

docker run -v=/dev/foo:/dev/foo

Wenn ich jetzt ein Laufwerk einfüge, das meiner udev-Regel entspricht, erstellt der Hostcomputer einen symbolischen Link in /dev/foo/sdX, der jetzt plötzlich für meinen Container sichtbar ist. Wenn das Laufwerk entfernt wird, verschwindet auch /dev/foo/sdX.

Die eine fehlende Funktion, die schön wäre, ist die Fähigkeit, ein Skript innerhalb des Containers auszulösen, wenn das Gerät erstellt wird. Eine udev-Regel kann dies auf dem Host-Rechner tun, aber im Container scheinen keine udev-Regeln ausgelöst zu werden. Also manuelle Abfrage ist es für jetzt.

1

Es hängt davon ab, welche Art von Gerät, das Sie würde zu handhaben möchten.

Udev in Containern ist in

Vor allem des letzten Link Hinweisen gibt, wie die Situation zu debuggen.

können Sie Ereignisse überwachen und udev unter Verwendung:

$ udevadm monitor 

Und für Spaß können Sie Ereignisse auslösen durch den Aufruf:

$ udevadm trigger --subsystem=net --action=change 

Die Docker Unterstützung für udev offensichtlich Docker beschränkt ist, da nicht ist funktioniert in allen Aspekten wie eine Virtualisierungsumgebung.

+0

Ich habe meine ursprüngliche Frage aktualisiert, um Beispiele zu geben. – Ryan

+0

Ich kann Ereignisse mit 'udevadm monitor' sehen, aber meine Regeln werden bei keinem dieser Befehle ausgelöst. – Ryan

+0

Ich habe eine praktikable Lösung gefunden. Siehe meine Antwort. – Ryan