使用用户权限和USB设备启动Docker容器

我创build了一个非常简单的脚本,使用USB摄像头在Raspberry Pi(RPi)上拍照。

为了帮助部署在多个RPi上,我想使用docker。

我做了一个完全符合我想要的图像:我每隔一段时间拍摄一张照片,然后保存在我启动容器时装入的主机分区上。 (顺便说一句,它使用pythonopencv

事情是我有时想在我的主计算机上发送这些图片,所以我希望图像获得我用来loginRPi的用户的许可。

所以当我创build容器时,我使用这样的东西:

 docker run -d --name container_name \ -v /home/user/images:/home/images \ -u $(id -u):$(id -g) \ --device /dev/video0 \ image_name 

问题是,它确实创build了具有用户权限的目录和文件, 但是我无法再读取USB摄像头。

如果我删除了-u参数,我可以读取相机,但是文件/目录是以root身份创build的,这会导致后续检索图像的问题。

顺便说一下,在做这个项目的时候,我对docker工人和学习有点新东西,所以如果有人对如何更有效地做到这一点有了想法,请让我知道!

我首先尝试创build一个群体(更容易更新图像),但是使用设备时遇到了困难。

您是否检查了设备所需的访问权限? 他们通常可以通过小组访问。 使用-u运行只会将您的用户设置为由id -g返回的组。

我还从一个仅限开发的容器访问设备和创build文件,并通过在容器中创build一个专用用户(包括访问这些设备所需的组)来解决这个问题。

以下是我在Dockerfile中为我的开发容器创build此用户的方法:

 # Create a non-root user with the same uid as on the host to allow proper file # permissions created from the container in volumes. Since it is not root, allow # calling sudo without password when required. ARG uid RUN useradd -M --uid $uid --user-group user --groups uucp \ && echo 'user ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/user \ && echo 'Defaults exempt_group+=user' >> /etc/sudoers.d/user \ && chmod a=r,o= /etc/sudoers.d/user USER user 

这些dockerfile指令创build一个非root用户,拥有自己的用户组,并将其包含在uucp组中以访问debian中的TTY设备。 用户ID作为docker构buildparameter passing(指令ARG uid ,加上docker构build选项--build-arg uid=$(id -u) )。 然后,我将其添加为没有密码的sudoer(主要是为了能够有时运行包pipe理命令,并尝试一些事情)。