Почему мои правила udev не работают внутри работающего док-контейнера?
У меня есть правила udev, написанные для создания SYMLINKS, когда устройство подключено. Правила работают нормально на хост-машине, но когда я запускаю контейнер с такими же правилами, установленными в /etc/udev/rules.d, они не работают внутри моего контейнера.
Я пытаюсь определить, когда подключен внешний диск, и создать соответствующую символическую ссылку. /dev/sdX создается при загрузке контейнера, если диск присутствовал во время docker run
, но он не появится после команды запуска и не исчезнет после извлечения диска.
Вот пример правила, которое отлично работает на хост-машине:
KERNEL=="sd?", SYMLINK+="test_%k"
2 ответа
Я понял. То, что я видел в интернете - это монтировать хост /dev
внутри контейнера:
docker run -v=/dev:/dev
(Примечание: не безопасно)
Но это очень опасно и в значительной степени разрушает хост-компьютер путем взлома с разрешениями (например, psuedo-терминалы не могут быть созданы).
Однако, если я настрою правило udev на хост-машине для создания устройств в уникальном подкаталоге, например /dev/foo/sdX
Я могу тогда просто поделиться dev/foo
с моим контейнером:
docker run -v=/dev/foo:/dev/foo
Теперь, когда я вставляю диск, который соответствует моему правилу udev, хост-машина создает символическую ссылку в /dev/foo/sdX
, который теперь вдруг виден моему контейнеру. Когда диск удален, /dev/foo/sdX
также исчезает.
Единственное, что было бы неплохо - это возможность запуска скрипта внутри контейнера при создании устройства. Правило udev может сделать это на хост-машине, но никакие правила udev, похоже, не сработали внутри контейнера. Итак, ручной опрос это пока.
Это зависит от того, с каким устройством вы хотите работать.
Udev в контейнерах упоминается в
- Как можно успешно включить синхронизацию udev в докере?
- https://groups.google.com/forum/
- https://docs.docker.com/engine/reference/commandline/daemon/
- http://dummdida.tumblr.com/post/118770655240/udev-events-in-containers
Особенно последняя ссылка дает подсказки, как отладить ситуацию.
Вы можете отслеживать события, связанные с udev, используя:
$ udevadm monitor
А для удовольствия вы можете вызвать события, позвонив:
$ udevadm trigger --subsystem=net --action=change
Поддержка докера для udev явно ограничена, так как докер не работает как среда виртуализации во всех аспектах.