将主机组导入Docker容器

问题描述:

我在树莓上使用Docker。我想以一个用户的身份(不是root用户)从容器中访问GPIO线路。将主机组导入Docker容器

树莓运行raspbian 8.0。

综观/sys/class主机上的内容:

[email protected]:~ $ 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:

[email protected]:/# su user 
[email protected]:/$ ls /sys/class/gpio/ 
ls: cannot open directory /sys/class/gpio/: Permission denied 

即使用户是GPIO组的一部分,因为我创造Dockerfile中的组并将其分配给我的用户:

[email protected]:/$ groups user 
user : user gpio fuse 

这是因为,由于某些原因,t他gpio组丢失:

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

如何使容器识别组?

作为解决方法,我可以更改/etc/group,以便gpio组匹配正确的UID。问题是gpio组的UID可以在我下一次安装raspberry上的raspbian上更改。

任何方式动态创建gpio组或检索Dockerfile中的主机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:\1:$(grep gpio ~/host/etc/group | awk -F ':' '{ print $3 }')/g" /etc/group > /tmp/group 
mv /tmp/group /etc/group 

,并安装/etc文件夹是这样的:

然后我安装的主机/ etc文件夹放入容器是这样的:

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

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