"루트"가 아닌 명명된 사용자로 실행될 때 장치 [GPIO] 액세스 권한이 있는 Docker

"루트"가 아닌 명명된 사용자로 실행될 때 장치 [GPIO] 액세스 권한이 있는 Docker

私たちのマルチプラットフォームソフトウェアライブラリには、さまざまなサードパーティ製のツールと一緒に[Ubuntu] Dockerコンテナ内で実行される内部テストシステムがあります。

簡単にするために、ホストとDockerコンテナの両方がtest_userUID 1000 / GID 1000に固定されているのと同じユーザーで実行されているため、問題なく2つの間でボリュームをマッピングできます。

しかし、今アクセスするにはDockerコンテナが必要です。装備ホスト(例:GPIO)から。これは、Dockerコンテナをuserとして具体的に実行する場合にのみ機能するようですroot。つまり、ホストのGPIOへのアクセスを正常に許可します(表示されているように、今テストするAPIをgpiodetect使用します)。libgpio

docker run -t --rm -i -u root --privileged -v /sys:/sys -v /dev:/dev docker_image /bin/bash
root@f1f7ca240c1e:/workdir# gpiodetect
gpiochip0 [pinctrl-bcm2711] (58 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)

...しかし、グループtest_userに追加すると、両方ともDockerコンテナ内にあります。rootそしてホストシステムでは、次のいずれも実行されません。

docker run -t --rm -i -u test_user --privileged -v /sys:/sys -v /dev:/dev docker_image /bin/bash
test_user@57130c86c196:/workdir$ gpiodetect
gpiodetect: unable to access GPIO chips: Permission denied
docker run -t --rm -i -u 1000:1000 --privileged -v /sys:/sys -v /dev:/dev docker_image /bin/bash`
test_user@57130c86c196:/workdir$ gpiodetect
gpiodetect: unable to access GPIO chips: Permission denied

残念ながら、Dockerコンテナをrootgitとして実行することは、ホストへのマッピングをめちゃくちゃにするので、理想的または簡単なオプションではありません(Gitなどの日陰のユーザーからの多くの叫び)。

rootDockerが実行中の[非]ユーザーにroot権限があり、GPIOにアクセスできると信じさせる方法はありますか?

ちなみに、ホストコンピュータで以下を実行してください。

host:~ $ groups test_user
test_user: test_user root

...そしてDockerコンテナから:

test_user@1716f343e8c7:/workdir$ groups test_user
test_user: test_user root
test_user@1716f343e8c7:/workdir$

答え1

Dockerに何もするように説得するのではなく、ホストtest_userとdocker_imageのgpiochipsへのアクセス権を与えます。その後、以前のようにDockerを実行できますtest_user

通常、Piではgpiosがgpioグループ内にあるため、test_userホストとdocker_imageの両方がそのグループ()に追加されます。adduser test_user gpio

これがPiのUbuntuで動作するかどうかはわかりません(私はRaspberry Pi OSユーザーです)。そうでない場合は、gpiochipsにグループを設定する必要があります。ただし、ホストマシンとDockerイメージからgpiochipデバイスにアクセスするための適切な権限がある限りはtest_user問題ありません。

たとえば、これは私にとって効果的で、root介入は必要ありませんでした。

pi@devpi4:~ $ docker run -t --rm -i -u test_user --privileged -v /sys:/sys -v /dev:/dev libgpiod_axs gpiodetect
gpiochip0 [pinctrl-bcm2711] (58 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)

ここでlibgpiod_axs、イメージはインストールされたイメージでlibgpiodあり、ホスト(名前指定可能)のユーザーと同様にtest_userグループメンバーシップを持ちます。gpioDockerイメージとホストのグループが一致する必要があります。pitest_userGID

答え2

@kent-gibson 上記の答えはビジネスです。明確にするために、以下を追加しましたDockerfile

RUN groupadd -g 997 gpio &&                                                                   \
    echo SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660" >> /etc/udev/rules.d/99-com.rules

...(997はデフォルトのRaspbian OSにあるグループのIDですgpio。グループIDと一致するルールが必要かどうか疑問に思っています...?)その後、作成した場所のudev最後にチーム用に追加しました。 DockerイメージからGPIOにアクセスできることは良い点です。Dockerfiletest_usergpiotest_user

また、Kentが指摘したように、/sysDockerコンテナへのマッピングは完全に不要だったので削除しました。

関連情報