我正在尝试使用 Arduino 的开发工具创建 docker 映像,但它无法与串行端口通信。
这是 Dockerfile:
FROM ubuntu:16.04
RUN echo "Acquire::http::Proxy \"http://172.17.0.2:3142\";" >> /etc/apt/apt.conf.d/10aptprox
RUN apt-get update && apt-get install -y --no-install-recommends \
sudo \
make \
build-essential \
&& rm -r /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y --no-install-recommends \
cmake \
picocom \
gcc-avr \
avr-libc \
avrdude \
&& rm -r /var/lib/apt/lists/*
# Configure the user
ARG uid
RUN useradd -M --uid $uid --user-group user --groups uucp,dialout \
&& echo 'user ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/user \
&& echo 'Defaults exempt_group+=${user}' >> /etc/sudoers.d/user \
&& chmod a=r,o= /etc/sudoers.d/user
USER user
(缓存就在那里,因此它不会在 Dockerfile 的每次迭代中下载包;-))。
这就是我构建它的方式:
docker build -t ard_cont --build-arg uid=$(id -u) .
启动它:
docker run --rm -it -u $(id -u):$(id -g) --device /dev/ttyUSB0 ardev bash
而且,当我尝试取出一些东西时:
user@866782740b3a:/$ echo "Hello world" >> /dev/ttyUSB0
bash: /dev/ttyUSB0: Permission denied
user@866782740b3a:/$ sudo su
root@866782740b3a:/# echo "Hello world" >> /dev/ttyUSB0
root@866782740b3a:/#
所以,我不知道如何配置用户以便它可以访问设备。
我在
docker run
阶段设法与 Docker 容器共享设备的方法之一是直接修改 cgroup 规则,或者更确切地说是 Docker 的 --device-cgroup-rule
。
为此,我们必须找出相关设备的主要和次要编号。在查看Linux内核文档/admin-guide/devices.txt时,我们可以发现
/dev/ttyUSBx
代表“主设备号为188(dec)的字符设备”
为了仔细检查我们是否可以发出以下信息:
$ stat -c '%F %Hr %Lr' /dev/ttyUSB0
character special file bc 0
(请注意,提供的数字是十六进制的,对于更多最新的发行版,
GNU Core utils
可以使用以下内容:
$ stat -c '%F %t %T'
character special file 188 0
有了这些信息,我们就可以在共享相关设备时启动
Docker
容器,方法是:
$ docker docker run --device-cgroup-rule='c 188:0 rmw' --rm -t our_fancy_container:latest
此操作的最后一步(在容器环境内完成):
$ docker exec --user 0 our_fancy_container mknod -m 0666 /dev/ttyUSB c 0xbc 0x0
注意
如果出现“权限被拒绝”类型的错误,您可能需要使用
udev
规则并修复主机端 /dev/ttyUSB0
的权限 (0666)。