Docker 中 /dev/tty* 的用户权限

问题描述 投票:0回答:1

我正在尝试使用 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:/#

所以,我不知道如何配置用户以便它可以访问设备。

linux docker permissions containers device
1个回答
0
投票

我在

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)。

© www.soinside.com 2019 - 2024. All rights reserved.