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

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

우리의 다중 플랫폼 소프트웨어 라이브러리에는 다양한 타사 도구와 함께 [Ubuntu] Docker 컨테이너 내에서 실행되는 내부 테스트 시스템이 있습니다.

단순화를 위해 호스트와 Docker 컨테이너는 모두 test_userUID 1000/GID 1000으로 고정된 동일한 사용자로 실행되므로 문제 없이 둘 간에 볼륨을 매핑할 수 있습니다.

하지만 이제 액세스하려면 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 컨테이너에 대한 매핑은 완전히 불필요했기 때문에 제거했습니다.

관련 정보