这个问题是由你能在一个码头容器中运行GUI应用程序吗?提出的。
其基本思想是运行带有音频和ui的应用程序(vlc、firefox、skype、.)
我在寻找使用脉冲音频的码头容器,但是我找到的所有容器都是在tcp上使用脉冲音频流的。(应用程序的安全沙箱)
在我的例子中,我会先播放容器内的应用程序的音频,直接播放到我的主机脉冲音频。(没有ssh隧道和臃肿的码头图像)
因为我的qt应用程序正在使用它;)
发布于 2015-03-11 11:41:07
我花了一段时间才发现需要什么。(Ubuntu)
我们从docker命令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 run -ti --rm \
-v /dev/snd:/dev/snd \
--privileged \
myContainer sh -c "echo run something"`
PULSEAUDIO:
更新:可以使用-v选项在容器中挂载脉冲音频套接字。这取决于您的版本和首选的访问方法。请参阅套接字方法的其他答案。
这里我们基本上需要/dev/shm
,/etc/machine-id
和/run/user/$uid/pulse
。但这还不是全部(可能是因为Ubuntu,以及他们过去是如何做到的)。环境变量XDG_RUNTIME_DIR
必须在主机系统中和您的坞容器中相同。您可能还需要/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"
在新的停靠版本中,您可能需要添加--privileged
。
当然,您可以将两者结合在一起,并将其与xServer
用户界面转发一起使用,如下所示:https://stackoverflow.com/a/28971413/2835523
我只想提一下:
dockerfile
中处理大部分这些(所有这些都没有使用的id)。uid=$(id -u)
使用id -g
获取用户id和gid创建用户脚本:
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
发布于 2015-03-11 19:22:48
受您发布的链接的启发,我能够创建以下解决方案。它是我所能得到的最轻巧的。但是,我不确定它是否(1)安全,(2)完全适合您的用例(因为它仍然使用网络)。
paprefs
,例如在Ubuntu计算机上使用sudo apt-get install paprefs
。sudo apt-get install -y pulseaudio
export "PULSE_SERVER=tcp:<host IP address>:<host Pulseaudio port>"
。例如,export "PULSE_SERVER=tcp:172.16.86.13:4713"
2。您可以使用ifconfig
查找您的IP地址,使用pax11publish
1查找Pulse音频端口。PULSE_SERVER
:如果没有,则必须在每个容器启动后对其进行初始化。让我的方法更好的建议将受到极大的赞赏,因为我目前正在处理与OP类似的问题。
参考文献:
更新(可能还有更好的解决方案):
这还可以使用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/<UID in container>/pulse
;但是,我还没有测试过这一点。
发布于 2015-04-27 10:38:12
在尝试了这里描述的大多数解决方案之后,我发现只有基于网络的PulseAudio才能真正发挥作用。但是,您可以通过保留身份验证来确保它的安全性。
paprefs
(PulseAudio首选项)> Network >X启用对本地声音设备的网络访问。现在使用这个套接字:
$ docker run \
-e PULSE_SERVER=tcp:$(hostname -i):4713 \
-e PULSE_COOKIE=/run/pulse/cookie \
-v ~/.config/pulse/cookie:/run/pulse/cookie \
...
检查在容器中运行的用户是否有权访问cookie文件~/.config/pulse/cookie
。
要测试它的工作原理:
$ apt-get install mplayer
$ mplayer /usr/share/sounds/alsa/Front_Right.wav
有关更多信息,请查看码头莫皮迪项目。
https://stackoverflow.com/questions/28985714
复制相似问题