我有一个通过串行端口(/dev/ttyUSB0
(进行通信的脚本。我想从 Docker 映像中运行它。但是,我似乎无权从图像中执行此操作。我遵循以下步骤:
在我的主机上,如果我运行ln -l /dev/ttyUSB0
我会得到:
crw-rw---- 1 root dialout 188, 0 jul 2 14:34 /dev/ttyUSB0
很好,这意味着为了读/写它,我需要成为root
,或者dialout
组的一部分。
我在主机中成为此组的成员:
$ sudo usermod -aG dialout $(whoami)
然后我注销并再次登录以使其有效。
之后,我验证我可以与主机的/dev/ttyUSB0
完美沟通。但是,如果我运行 docker 映像:
docker run --user=1000:1000 --rm=true --tty=true --privileged=true --device=/dev/ttyUSB0 --volume=<my_dir>:<my_dir> --workdir=<my_dir> <my_docker_image> <my_script>
然后它抱怨:
can't open device "/dev/ttyUSB0": Permission denied
但是,如果我使用:--user=1000:20
,那么它可以正常工作。20
组是dialout
组。
现在我的问题:
为什么 Docker 不了解我的用户 (1000( 和组 (1000( 是dialout
组的一部分?
当我使用旧的docker (apt-get install docker-io, docker-engine
( 时,这是有效的,但在更新到新Docker CE
后,它停止工作。
设置:
- Ubuntu 16.04.2 LTS 内核 4.4.0-83 通用。 Docker 版本
- :Docker 版本 17.06.0-ce,内部版本 02c1d87。
谢谢!
如评论中所述,解决方案是将--group-add=dialout
传递给 docker 运行调用。但是,请注意,当使用 docker 映像时,该映像提供了一种使用环境变量(通常-e PUID=<UID> -e PGID=<GID>
(指定用户和组的方法,它会覆盖该设置。