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”命令中访问串行设备时,它工作正常,但我需要能够从已经运行的容器访问串行设备。
有谁知道我错过了什么?
感谢@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 操作系统的组合,而不一定适用于具有不同环境的其他用户。
| 归档时间: |
|
| 查看次数: |
5489 次 |
| 最近记录: |