将主机组导入Docker容器

时间:2016-09-27 19:47:15

标签: unix docker filesystems

我在树莓上使用Docker。我想以用户身份(而不是root用户)从容器访问GPIO行。

树莓运行raspbian 8.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组的一部分,因为我在Dockerfile中创建了组并将其分配给我的用户:

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时改变。

如何在Dockerfile中动态创建gpio组或检索主机gpio GID?

1 个答案:

答案 0 :(得分:0)

我在容器启动时最终添加了一个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:\1:$(grep gpio ~/host/etc/group | awk -F ':' '{ print $3 }')/g" /etc/group > /tmp/group
mv /tmp/group /etc/group

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

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

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

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