我花了一些时间才发现需要什么。(Ubuntu)
我们从 docker run 命令开始docker run -ti --rm myContainer sh -c "echo run something"
ALSA:
我们需要/dev/snd
一些硬件访问权限。当我们把它放在一起时,我们有
docker run -ti --rm \
-v /dev/snd:/dev/snd \
--lxc-conf='lxc.cgroup.devices.allow = c 116:* rwm' \
myContainer sh -c "echo run something"`
在没有 lxc 标志的新 docker 版本中,你应该使用这个:
docker run -ti --rm \
-v /dev/snd:/dev/snd \
--privileged \
myContainer sh -c "echo run something"`
PULSEAUDIO:
更新:使用 -v 选项在容器中安装 pulseaudio 套接字可能就足够了。这取决于您的版本和首选的访问方法。请参阅套接字方法的其他答案。
这里我们基本上需要/dev/shm
和。但这还不是全部(可能是因为 Ubuntu 以及他们过去的做法)。主机系统和docker 容器中的环境变量必须相同。您可能还需要,因为某些应用程序正在从此处访问机器 ID(可能仅包含指向“真实”机器 ID 的符号链接)。至少您可能需要隐藏的主文件夹来存放一些临时数据(我对此不确定)。/etc/machine-id
/run/user/$uid/pulse
XDG_RUNTIME_DIR
/var/lib/dbus
~/.pulse
docker run -ti --rm \
-v /dev/shm:/dev/shm \
-v /etc/machine-id:/etc/machine-id \
-v /run/user/$uid/pulse:/run/user/$uid/pulse \
-v /var/lib/dbus:/var/lib/dbus \
-v ~/.pulse:/home/$dockerUsername/.pulse \
myContainer sh -c "echo run something"
在新的 docker 版本中,您可能需要添加--privileged
.
当然,您可以将两者结合在一起并将其与xServer
ui 转发一起使用,如下所示:https ://stackoverflow.com/a/28971413/2835523
顺便提一下:
- 您可以在
dockerfile
- 用于
uid=$(id -u)
获取用户 id 和 gidid -g
- 用这个 id 创建一个 docker 用户
创建用户脚本:
mkdir -p /home/$dockerUsername && \
echo "$dockerUsername:x:${uid}:${gid}:$dockerUsername,,,:/home/$dockerUsername:/bin/bash" >> /etc/passwd && \
echo "$dockerUsername:x:${uid}:" >> /etc/group && \
mkdir /etc/sudoers.d && \
echo "$dockerUsername ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$dockerUsername && \
chmod 0440 /etc/sudoers.d/$dockerUsername && \
chown ${uid}:${gid} -R /home/$dockerUsername