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.