将主机组导入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行。