将主机组导入 Docker 容器

Import host group into Docker container

我正在树莓派上使用 Docker。我想以用户身份(而不是根用户)访问容器中的 GPIO 线路。

覆盆子运行raspbian8.0.

查看主机上/sys/class的内容:

pi@raspberrypi:~ $ ls -al /sys/class/
total 0
[...]
drwxrwx---  2 root gpio 0 Sep 27 19:05 gpio
[...]

该文件夹属于组 gpio。

当我以这种方式启动我的容器时:

docker run -it --privileged container-name bash

用户无法访问 gpio 文件夹:

root@f66a9f1cca91:/# su user
user@f66a9f1cca91:/$ ls /sys/class/gpio/
ls: cannot open directory /sys/class/gpio/: Permission denied

即使用户是 gpio 组的一部分,因为我在 Docker 文件中创建了组并将其分配给了我的用户:

user@f66a9f1cca91:/$ groups user
user : user gpio fuse

这是因为,由于某种原因,gpio 组丢失了:

root@f66a9f1cca91:/# ls -al /sys/class/
total 0
[...]
drwxrwx---  2 root  997 0 Sep 27 19:05 gpio
[...]

如何让容器识别组?

作为解决方法,我可以更改 /etc/group 以便 gpio 组匹配正确的 UID。问题是 gpio 组的 UID 可能会在我下一次在树莓派上安装 raspbian 时发生变化。

有什么方法可以动态创建 gpio 组或在 Docker 文件中检索主机 gpio GID?

我最终在容器启动时添加了一个 startup.sh。 Dockerfile:

ADD startup.sh /root/
RUN chmod +c /root/startup.sh
CMD bash -c startup.sh ; bash

startup.sh:

#!/bin/bash

# Change local gpio group GID to the host gpio group GID so use jedi has access to /sys/class/gpio
sed -r "s/gpio:([^:]*):[0-9]*/gpio::$(grep gpio ~/host/etc/group | awk -F ':' '{ print  }')/g" /etc/group > /tmp/group
mv /tmp/group /etc/group

并以这种方式挂载 /etc 文件夹:

然后我以这种方式将主机 /etc 文件夹挂载到容器中:

docker tun -it -v /etc/:/root/host/etc/

有了这个,容器中的 gpio 组与主机上的 gpio 组具有相同的 GID,用户可以通过文件系统访问 gpio 行 /sys/class/gpio