4

我正在尝试访问已经运行的特权 docker 容器中的串行端口(作为用户),但是我收到“权限被拒绝”错误,而权限应该正确设置。作为一个最小的可重现示例(假设串行设备连接到 /dev/ttyUSB0):

# start docker container with your user id, give it privileged access and mount /dev
docker run -itd --user $(id -u) --name test --privileged -v /dev:/dev ubuntu
# add user and add it to dialout (not sure if this is necessary as we have privileged access)
docker exec -it --user 0 test sh -c "groupadd -g $(id -g) user && useradd -m -u $(id -u) -g $(id -g) -G dialout user"
# install picocom to test serial connection
docker exec -it --user 0 test sh -c "apt update && apt install -y picocom"
# run picocom on /dev/ttyUSB0 to check if we can open it
docker exec -it test sh -c "picocom /dev/ttyUSB0"

但是当我尝试这个时,我得到了这个错误:

FATAL: cannot open /dev/ttyUSB0: Permission denied

当我以 root 身份执行命令时,或者当我直接在“docker run”命令中访问串行设备时,它工作正常,但我需要能够从已经运行的容器中访问串行设备。

有谁知道我错过了什么?

4

2 回答 2

2

感谢@sawdust 指出我的答案。

问题是我在 Manjaro (Arch) OS 中运行 ubuntu docker 容器,并且在 Arch ttyUSB 上归 uucp (group id 987) 所有,而在 ubuntu 上它归 dialout (group id 20) 所有。

所以在将/dev/ttyUSB0挂载到docker容器时,它仍然归gid 987所有,但是在ubuntu环境下这个组id不是拨出的,所以即使添加用户拨出,用户也没有打开串口的权限.

快速修复将是创建一个具有正确 gid 的组并将您的用户添加到其中:

docker exec -it --user 0 test sh -c "groupadd -g 987 ttyusb && usermod -a -G ttyusb user"

但这不是一个完整的解决方案,因为这只会使其适用于您的主机操作系统和 docker 操作系统的组合,而不一定适用于具有不同环境的其他用户。

于 2021-09-03T06:29:21.993 回答
0

如果它仍然相关,则以下解决方案对我有用:

docker run --gpus all -it --name [container_name] \
        -v "$(pwd)/..":/home/app \
        --privileged -v /dev/bus/usb:/dev/bus/usb \
        --privileged -v /dev/ttyACM0:/dev/ttyACM0 \
        [image_container_name] bash
于 2021-11-16T21:50:41.707 回答