Saltar al contenido

Docker: ¿una forma de dar acceso a un dispositivo host USB o serie?

Solución:

Hay un par de opciones. Puedes usar el --device bandera que el usuario puede utilizar para acceder a dispositivos USB sin --privileged modo:

docker run -t -i --device=/dev/ttyUSB0 ubuntu bash

Alternativamente, suponiendo que su dispositivo USB esté disponible con controladores funcionando, etc.en el host en /dev/bus/usb, puede montar esto en el contenedor usando el modo privilegiado y la opción de volúmenes. Por ejemplo:

docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash

Tenga en cuenta que, como su nombre lo indica, --privileged es inseguro y debe manejarse con cuidado.

Con las versiones actuales de Docker, puede utilizar el --device flag para lograr lo que desea, sin necesidad de dar acceso a todos los dispositivos USB.

Por ejemplo, si quisiera hacer solo /dev/ttyUSB0 accesible dentro de su contenedor Docker, podría hacer algo como:

docker run -t -i --device=/dev/ttyUSB0 ubuntu bash

--device funciona hasta que su dispositivo USB se desconecta / vuelve a conectar y luego deja de funcionar. Tienes que usar cgroup devices.allow evitarlo.
Podrías usar -v /dev:/dev pero eso es inseguro ya que asigna todos los dispositivos de su host al contenedor, incluidos los dispositivos de disco sin formato, etc. Básicamente, esto permite que el contenedor obtenga la raíz en el host, que generalmente no es lo que desea.
El uso del enfoque de cgroups es mejor en ese sentido y funciona en dispositivos que se agregan después del inicio del contenedor.

Consulte los detalles aquí: Acceso a dispositivos USB en Docker sin usar –privileged

Es un poco difícil de pegar, pero en pocas palabras, debe obtener el número principal para su dispositivo de caracteres y enviarlo a cgroup:

189 es el número principal de / dev / ttyUSB *, que puede obtener con ‘ls -l’. Puede ser diferente en su sistema que en el mío:

[email protected]:~# echo 'c 189:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow  
(A contains the docker containerID)

Luego comience su contenedor de esta manera:

docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash debian:amd64

sin hacer esto, cualquier dispositivo recién enchufado o reiniciado después de que se inició el contenedor, obtendrá una nueva ID de bus y no se le permitirá el acceso al contenedor.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *