para - webcam linux
Compartir dispositivos(webcam, unidades USB, etc.) con Docker (3)
Creo que, en teoría, esto es posible con seguridad utilizando el indicador --privileged
, ya que esto le da la posibilidad de acceder a todos los dispositivos hosts. Si instala usbutils o similar (dependiendo de la distribución de sus imágenes) verá que el contenedor privilegiado puede ver los dispositivos lsusb
en lsusb
cuando se ejecuta lsusb
. Lamentablemente, aunque no aparecen en / dev. Secuencias de comandos para la creación de esos descriptores y que su software los maneje adecuadamente bajo / dev pueden involucrarse bastante desafortunadamente. Sin embargo, no tiene que ser así para tus dispositivos.
Lo que puede hacer como primer intento es simplemente crearlos usando mknod. Intenté esto con mi teléfono HTC y funcionó (los detalles no son relevantes aquí), simplemente revise la línea del dispositivo de conexión en caliente en lsusb:
Bus 003 Device 002: ID 0bb4:0f25 HTC (High Tech Computer Corp.) One M8
Vaya a la carpeta correcta para el descriptor:
cd /dev/bus/usb/003
compruebe la versión principal del controlador usb en su núcleo a partir de los descriptores existentes:
root@1a11f7c329a9:/dev/bus/usb/003# ls -la
total 0
drwxr-xr-x 2 root root 160 Dec 26 13:40 .
drwxr-xr-x 6 root root 120 Dec 26 13:30 ..
crw-rw-r-- 1 root root 189, 256 Dec 26 13:30 001
crw-rw-r-- 1 root root 189, 258 Dec 26 13:30 003
crw-rw-r-- 1 root root 189, 259 Dec 26 13:30 004
crw-rw-r-- 1 root root 189, 260 Dec 26 13:30 005
crw-rw-r-- 1 root root 189, 261 Dec 26 13:30 006
=> 189 :) => crea el cabeceo y mientras lo hace usa la versión menor 0.
mknod 002 c 189 0
=> al menos lsusb -v
ahora es capaz de abrir el dispositivo. Lo mismo debería funcionar para la mayoría de las imo de hardware, con algunas excepciones.
Lo que podría hacer como alternativa, aunque posiblemente sea más lento, pero sin duda más seguro y más en el espíritu de Docker y la creación de contenedores, es utilizar contenedores para acceder a sus dispositivos cuando los monte en caliente y luego los comparta con el contenedor principal que ejecuta su aplicación de video. via socat tty via tcp.
Digamos que hotplug / dev / video0 en el host, podría girar un nuevo contenedor que tiene este dispositivo montado en ese evento. Este contenedor (que tiene instalado socat) podría correr:
socat tcp-l:54321,reuseaddr,fork file:/dev/video0,nonblock,waitlock=/var/run/video0.lock
Asumiendo que esto tiene el servidor host0 de nombre de host, ahora podría crear el descriptor para video0 en el cliente a través de:
socat pty,link=/dev/video0,waitslave tcp:video0-server:54321
Ahora deberías poder usar el dispositivo bien. Para muchos dispositivos, la sobrecarga de socat no debería ser un problema, creo. Si esta secuencia de comandos a través de múltiples contenedores que se comunican dinámicamente con su contenedor principal a través de la red es una opción y el rendimiento no se ve afectado de manera significativa por la sobrecarga, la última opción es más limpia y más segura que el modo --privileged
en mi opinión.
Tengo la necesidad de compartir dispositivos específicos de /dev
en mi máquina Linux host con mis contenedores docker.
El indicador --privileged
funciona para compartir cualquier dispositivo en /dev
que esté presente en el momento en que se --privileged
la --privileged
la --privileged
docker run
, pero los dispositivos que se agreguen o eliminen posteriormente no se propagarán al contenedor.
Intenté docker run -v=/dev:/dev ...
pero eso terminó por atascar los permisos y la propiedad de archivos como / dev / pts, lo que llevó a la máquina host a no poder crear nuevos terminales psuedo.
También probé el indicador --device
, pero eso no te permite compartir un dispositivo que aún no existe.
Finalmente, intenté compartir volúmenes para dispositivos como -v=/dev/video0:/dev/video0
pero si / dev / video0 no existe antes de ejecutarse, la ventana acoplable crea un directorio allí y una cámara web no tomará / dev / video0 cuando conectado.
¿Hay alguna forma mejor de obtener esta funcionalidad compatible?
Es difícil colocar el dispositivo cuando el sistema se está ejecutando (detección USB); debe hacer un script para ubicar los dispositivos a medida que se encuentran y hacer el --rm (por lo que cada vez que sale de la máquina se elimina y tiene un nueva oportunidad de importar los dispositivos)
Usted está buscando comprobar la bandera --device
--device=[]
Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm)
¡Que tengas un buen día!