使用用户权限和USB设备启动Docker容器
我创build了一个非常简单的脚本,使用USB摄像头在Raspberry Pi(RPi)上拍照。
为了帮助部署在多个RPi上,我想使用docker。
我做了一个完全符合我想要的图像:我每隔一段时间拍摄一张照片,然后保存在我启动容器时装入的主机分区上。 (顺便说一句,它使用python
和opencv
)
事情是我有时想在我的主计算机上发送这些图片,所以我希望图像获得我用来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理命令,并尝试一些事情)。
- Docker镜像> google / cadvisor:最新
- Docker中的量angular器testing – asynchronouscallback没有在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时