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

时间:2017-06-23 10:34:26

标签: python opencv docker raspberry-pi raspbian

我创建了一个非常简单的脚本,使用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参数,我可以读取相机,但文件/目录是以为根创建的,这会导致检测到图像后出现问题。

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

1 个答案:

答案 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(主要是为了能够有时运行包管理命令并尝试一些事情)。