在Ubuntu 16.04中的系统启动时创建pulseaudio套接字

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

我正在运行一个docker容器,我将脉冲服务器环境变量传递给我的容器。容器设置为始终重新启动策略。如果/ tmp文件夹中不存在“pulseaudio.socket”,则容器无法运行。

因此,为了实现我的目标,我将命令"pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket"添加到启动应用程序[通过搜索启动程序访问的GUI程序]。此命令在/ tmp文件夹中创建pulseaudio.socket文件

如果在docker启动容器之前创建pulseaudio.socket文件,则此方法大部分时间都有效。如果docker在创建pulseaudio.socket之前启动容器,则容器无法启动。

为了确保在docker启动容器之前始终创建pulseaudio.socket,我将代码"pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket"添加到/etc/rc.local并尝试将其添加到init.d.

但是将代码添加到/etc/rc.local或init.d会在/ tmp文件夹中创建一个pulse-PKdhtXMmr18n文件夹而不是文件pulseaudio.socket

如何确保始终创建名为pulseaudio.socket的文件而不是pulse-PKdhtXMmr18n?

我的主要目标是在docker启动之前或在docker尝试启动具有重启策略的容器之前创建/tmp/pulseaudio.socket文件。

或者有没有任何方式使得docker服务首先检查pulseaudio.socket文件是否存在以及是否存在然后只启动容器?

我该怎么做?

docker ubuntu-16.04 audio-streaming pulseaudio
1个回答
1
投票

我解决了这个问题:

我的容器有一个节点脚本启动应用程序,这个应用程序需要pulseaudio才能正常运行。所以这是我的docker run命令。请注意粗体代码。多数民众赞成我改变了。

上一个命令

sudo docker run --pid = host -dit --restart除非停止--env PULSE_SERVER = unix:/tmp/pulseaudio.socket --env PULSE_COOKIE = / home / $ USER / pulseaudio.cookie --volume / tmp / pulseaudio .socket:/tmp/pulseaudio.socket --volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u):$(id -g) - 特权--net =主机ubuntu bash -c“节点service.js && tail -F anything”

当前命令

sudo docker run --pid = host -dit --restart除非 - 停止--env PULSE_SERVER = unix:/tmp/pulseaudio.socket --env PULSE_COOKIE = / home / $ USER / pulseaudio.cookie --volume / tmp:/ tmp --volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u):$(id -g)--privileged --net = host ubuntu bash -c“sh checksocket.sh && tail -F anything”

在上一个命令中,容器只有在host的/ tmp文件夹中有pulseaudio.socket文件时才会启动。

现在当前工作命令挂载--volume / tmp:/ tmp而不是--volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket

和sh checksocket.sh命令执行我在容器内创建的checksocket.sh文件。

这是我的checksocket.sh文件的代码:

#!/bin/bash
while sleep 0.5;
do if [ -e /tmp/pulseaudio.socket ]
then
value="node service.js"
exec $value
break
fi
done

这个shell脚本不断检查挂载的/ tmp文件夹中的pulseaudio.socket文件,如果它存在则只启动我的节点服务。

这样,只要我重启机器,我的容器就会一直启动,一旦shell脚本检测到/ tmp文件夹中的pulseaudio.socket,节点服务就会启动。

我希望这可以帮助那些尝试将pulseaudio与docker一起使用以实现声音多路复用或避免“设备或资源忙”错误的人(当你使用带有alsa的docker作为alsa直接捕获声卡时出现设备或资源繁忙错误)在主机上。如果有人需要更多帮助,请告诉我

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