如何确保主机GID和docker容器GID之间的正确关系?

时间:2018-02-21 22:47:06

标签: docker permissions

我试图在Docker容器中设置声音,因此我创建了一个安装了alsa utils的图像和一个属于audio组的用户。正如文档和多个教程中所指出的,我使用--device /dev/snd运行了图像。结果是我可以毫无问题地播放声音,但仅在以sudo运行命令时才会播放。

我想到的一个假设是,为什么会出现这种情况,主机上和容器内的audio组的GID是不同的。我检查了一下,确实存在差异。当我使用--group-add <host_audio_gid>运行图像时,声音工作正常。

我的结论是,它不一定是这里重要的群体的名称,而是它的主机GID。是对的吗?如果是这样,我如何(如果可能的话)确保我的用户始终被添加到主机audio组而不在运行映像时明确指定它?如果我的结论是错误的,我思考的缺陷在哪里?我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

首先,避免在容器中使用 sudo(例如改用 gosu)。

我带来了坏消息,你的结论是正确的。我遇到了属于 /dev/dri/card0root:video 的同样问题。但是 GID 存在差异。组 video 在主机系统 (Arch Linux) 上具有 GID 91,但在容器 (Ubuntu:20.10) 中具有不同的 GID 44

据我所知,项目 x11docker 可以通过操作 CT 的 /etc/group 来解决该问题,但如果您想手动解决它而不会出现任何膨胀,我建议采用这种不太漂亮的解决方法:

在您的 Dockerfile 中向具有相应 gid 的用户添加另一个组:

ARG AGID
RUN groupadd -og $AGID hostaudio && usermod -a -G hostaudio ctuser

然后通过传递主机 GID 来构建它:

docker build --build-arg AGID=$(getent group audio | cut -d: -f3) -t yourapp .