我在树莓上使用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?
答案 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行。