使用“docker exec”访问特权 Docker 容器中的 ttyUSB 时权限被拒绝

wil*_*994 5 permissions serial-port docker docker-exec

我正在尝试访问已经运行的特权 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"
Run Code Online (Sandbox Code Playgroud)

但是当尝试这个时我收到这个错误:

FATAL: cannot open /dev/ttyUSB0: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

有谁知道我错过了什么?

wil*_*994 4

感谢@sawdust 为我指出了答案。

问题是我在 Manjaro (Arch) 操作系统中运行一个 ubuntu docker 容器,在 Arch 上 ttyUSB 由 uucp (组 id 987)拥有,而在 ubuntu 上它由 dialout (组 id 20)拥有。

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

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

docker exec -it --user 0 test sh -c "groupadd -g 987 ttyusb && usermod -a -G ttyusb user"
Run Code Online (Sandbox Code Playgroud)

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