gpt4 book ai didi

docker - 使用 "docker exec"在特权 docker 容器中访问 ttyUSB 时权限被拒绝

转载 作者:行者123 更新时间:2023-12-04 17:14:11 26 4
gpt4 key购买 nike

我正在尝试访问已经运行的特权 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”命令中访问串行设备时,它工作正常,但我需要能够从已经运行的容器访问串行设备。
有谁知道我错过了什么?

最佳答案

感谢@sawdust 为我指出答案。
问题是我在 Manjaro (Arch) OS 中运行了一个 ubuntu docker 容器,在 Arch 上 ttyUSB 归 uucp(组 ID 987)所有,而在 ubuntu 上它归 dialout(组 ID 20)所有。
所以当挂载/dev/ttyUSB0到docker容器中时,它仍然归gid 987所有,但是在ubuntu环境下这个group id是没有dialout的,所以即使把用户加入dialout,用户也没有权限打开串口.
快速修复是创建一个具有正确 gid 的组并将您的用户添加到其中:

docker exec -it --user 0 test sh -c "groupadd -g 987 ttyusb && usermod -a -G ttyusb user"
但这不是一个完整的解决方案,因为这只适用于您的主机操作系统和 docker 操作系统的组合,而不一定适用于具有不同环境的其他用户。

关于docker - 使用 "docker exec"在特权 docker 容器中访问 ttyUSB 时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68997623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com