私たちのマルチプラットフォームソフトウェアライブラリには、さまざまなサードパーティ製のツールと一緒に[Ubuntu] Dockerコンテナ内で実行される内部テストシステムがあります。
簡単にするために、ホストとDockerコンテナの両方がtest_user
UID 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コンテナをroot
gitとして実行することは、ホストへのマッピングをめちゃくちゃにするので、理想的または簡単なオプションではありません(Gitなどの日陰のユーザーからの多くの叫び)。
root
Dockerが実行中の[非]ユーザーに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
グループメンバーシップを持ちます。gpio
Dockerイメージとホストのグループが一致する必要があります。pi
test_user
GID
答え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にアクセスできることは良い点です。Dockerfile
test_user
gpio
test_user
また、Kentが指摘したように、/sys
Dockerコンテナへのマッピングは完全に不要だったので削除しました。