Unix 将主机组导入Docker容器

Unix 将主机组导入Docker容器,unix,docker,filesystems,Unix,Docker,Filesystems,我在用Docker做覆盆子。我想以用户(而不是根用户)身份从容器访问GPIO行 树莓运行树莓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 do

我在用Docker做覆盆子。我想以用户(而不是根用户)身份从容器访问GPIO行

树莓运行树莓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
docker tun -it -v /etc/:/root/host/etc/
用户无法访问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可能会在我下次在raspberry上安装raspbian时更改


有没有办法在Dockerfile中动态创建gpio组或检索主机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
文件夹:

docker run -it --privileged container-name bash
docker tun -it -v /etc/:/root/host/etc/
然后,我通过以下方式将主机/etc文件夹装入容器:

docker run -it --privileged container-name bash
docker tun -it -v /etc/:/root/host/etc/

这样,容器中的gpio组与主机上的gpio组具有相同的GID,用户可以通过文件系统
/sys/class/gpio
访问gpio行。容器启动时,我添加了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
文件夹:

docker run -it --privileged container-name bash
docker tun -it -v /etc/:/root/host/etc/
然后,我通过以下方式将主机/etc文件夹装入容器:

docker run -it --privileged container-name bash
docker tun -it -v /etc/:/root/host/etc/
这样,容器中的gpio组与主机上的gpio组具有相同的GID,用户可以通过文件系统
/sys/class/gpio
访问gpio行