我创建了一个非常简单的脚本,使用USB相机在Raspberry Pi(RPi)上拍照。
为了帮助部署多个RPi,我想使用Docker。
有时我制作的图像完全符合我的要求:我每隔T拍一张照片然后保存在我启动容器时装载的主机分区上。 (顺便说一句,它使用Python和OpenCV。)
我想在主计算机上发送这些图片,所以我希望图片获得用户登录RPi的权限。
因此,当我创建容器时,我使用这样的东西:
docker run -d --name container_name \
-v /home/user/images:/home/images \
-u $(id -u):$(id -g) \
--device /dev/video0 \
image_name
它确实创建了具有用户权限的目录和文件,但是我无法再读取USB相机。
如果我删除了-u
参数,我可以读取相机,但文件/目录是以为根创建的,这会导致检测到图像后出现问题。
我首先尝试制作一个群体(更容易更新图像),但是我使用设备时遇到了困难。
答案 0 :(得分:0)
您是否检查过设备所需的访问权限?他们通常可以通过团体访问。使用-u
运行只会为您的用户设置id -g
返回的组。
我还访问设备并从仅开发容器创建文件,并通过在容器内创建专用用户(包括访问设备所需的组)来解决此问题。
以下是我在Dockerfile中为我的开发容器创建此用户的方法:
# 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指令创建一个非root用户,拥有自己的用户组,并将其包含在uucp
组中以访问Debian中的TTY设备。用户标识作为Docker构建参数(指令ARG uid
,以及Docker构建选项--build-arg uid=$(id -u)
)传递。然后我将它添加为没有密码的sudoer(主要是为了能够有时运行包管理命令并尝试一些事情)。