将主机组导入 Docker 容器
Import host group into Docker container
我正在树莓派上使用 Docker。我想以用户身份(而不是根用户)访问容器中的 GPIO 线路。
覆盆子运行raspbian8.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 组的一部分,因为我在 Docker 文件中创建了组并将其分配给了我的用户:
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 时发生变化。
有什么方法可以动态创建 gpio 组或在 Docker 文件中检索主机 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::$(grep gpio ~/host/etc/group | awk -F ':' '{ print }')/g" /etc/group > /tmp/group
mv /tmp/group /etc/group
并以这种方式挂载 /etc
文件夹:
然后我以这种方式将主机 /etc 文件夹挂载到容器中:
docker tun -it -v /etc/:/root/host/etc/
有了这个,容器中的 gpio 组与主机上的 gpio 组具有相同的 GID,用户可以通过文件系统访问 gpio 行 /sys/class/gpio
。
我正在树莓派上使用 Docker。我想以用户身份(而不是根用户)访问容器中的 GPIO 线路。
覆盆子运行raspbian8.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 组的一部分,因为我在 Docker 文件中创建了组并将其分配给了我的用户:
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 时发生变化。
有什么方法可以动态创建 gpio 组或在 Docker 文件中检索主机 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::$(grep gpio ~/host/etc/group | awk -F ':' '{ print }')/g" /etc/group > /tmp/group
mv /tmp/group /etc/group
并以这种方式挂载 /etc
文件夹:
然后我以这种方式将主机 /etc 文件夹挂载到容器中:
docker tun -it -v /etc/:/root/host/etc/
有了这个,容器中的 gpio 组与主机上的 gpio 组具有相同的 GID,用户可以通过文件系统访问 gpio 行 /sys/class/gpio
。