【问题标题】:Import host group into Docker container将主机组导入 Docker 容器
【发布时间】:2016-09-27 19:47:15
【问题描述】:

我在覆盆子上使用 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 时更改。

有什么方法可以动态创建 gpio 组或在 Dockerfile 中检索主机 gpio GID 吗?

【问题讨论】:

    标签: unix docker filesystems


    【解决方案1】:

    我最终在容器启动时添加了一个 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 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多