作者:lovely--蕙蕙_868 | 来源:互联网 | 2023-05-18 15:02
这个问题的灵感来自于您是否可以在docker容器中运行GUI应用程序?.
基本的想法是运行带有音频和ui的应用程序(vlc,firefox,skype,...)
我正在使用pulseaudio搜索docker容器,但我发现所有使用pulseaudio流在tcp上的容器.(应用程序的安全沙箱)
https://gist.github.com/hybris42/ce429de428e5af3a344a
https://github.com/jlund/docker-chrome-pulseaudio
https://github.com/tomparys/docker-skype-pulseaudio
在我的情况下,我会优先从容器内的应用程序直接播放音频到我的主机pulseaudio.(没有ssh隧道和臃肿的docker图像)
Pulseaudio因为我的qt app正在使用它;)
1> A. Binzxxxxx..:
我花了一些时间才发现需要什么.(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:
在这里我们需要基本/dev/shm
,/etc/machine-id
和/run/user/$uid/pulse
.但这并非全部(可能是因为Ubuntu以及他们过去是如何做到的).envirorment变量XDG_RUNTIME_DIR
必须在主机系统和docker 容器中相同.您可能还需要,/var/lib/dbus
因为某些应用程序正在从此处访问计算机ID(可能只包含指向"真实"计算机ID的符号链接).至少你可能需要~/.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
仅举几个:
你可以处理大部分(所有没有使用过的id) dockerfile
用uid=$(id -u)
得到的用户ID和GID与id -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
ALSA方法对我不起作用。我收到以下错误`ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开从属服务器`。
2> ctitze..:
受您发布的链接的启发,我能够创建以下解决方案。它是我所能得到的那样轻巧。但是,我不确定它是否(1)是安全的,并且(2)是否完全适合您的用例(因为它仍然使用网络)。
paprefs
在主机系统上安装,例如sudo apt-get install paprefs
在Ubuntu计算机上使用。
启动PulseAudio首选项,转到“网络服务器”选项卡,然后选中“启用对本地声音设备的网络访问”复选框[1]
重启你的电脑。(仅重启Pulseaudio在Ubuntu 14.10上对我不起作用)
在您的容器中安装Pulseaudio,例如 sudo apt-get install -y pulseaudio
在您的容器中,运行export "PULSE_SERVER=tcp::"
。例如,export "PULSE_SERVER=tcp:172.16.86.13:4713"
[2]。您可以ifconfig
使用pax11publish
[1] 查找IP地址,使用Pulseaudio端口查找。
而已。如果IP地址和Pulseaudio端口可能会发生变化,则应该自动执行步骤5。另外,我不确定Docker是否永久存储诸如PULSE_SERVER
以下的环境变量:如果不是,则必须在每个容器启动后对其进行初始化。
由于我目前正在研究与OP类似的问题,因此希望使我的方法变得更好的建议将不胜感激。
参考文献:
[1] https://github.com/jlund/docker-chrome-pulseaudio
[2] https://github.com/jlund/docker-chrome-pulseaudio/blob/master/Dockerfile
更新(可能是更好的解决方案):
这也可以使用Unix套接字而不是TCP套接字来工作:
用以下命令启动容器 -v /run/user/$UID/pulse/native:/path/to/pulseaudio/socket
在容器中,运行 export "PULSE_SERVER=unix:/path/to/pulseaudio/socket"
该/path/to/pulseaudio/socket
可以是任何东西,用于测试目的,我使用/home/user/pulse
。
也许它甚至可以在主机上使用与默认套接字相同的路径(照顾$ UID部分),这样最终的解决方案将是-v /run/user/$UID/pulse/native:/run/user//pulse
; 我还没有测试过。