2016-09-27 101 views
0

我在樹莓上使用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?

回答

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文件夾是這樣的:

然後我安裝的主機/ etc文件夾放入容器是這樣的:

docker tun -it -v /etc/:/root/host/etc/ 

這樣,容器中的gpio組具有與主機上的gpio組相同的GID,用戶可以通過文件系統/sys/class/gpio訪問gpio行。

相關問題