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

Docker 在Ubuntu 16.04系统启动时创建pulseaudio套接字,docker,ubuntu-16.04,audio-streaming,pulseaudio,Docker,Ubuntu 16.04,Audio Streaming,Pulseaudio,我正在运行一个docker容器,并将pulse server环境变量传递给我的容器。容器设置为“始终重新启动”策略。如果/tmp文件夹中不存在“pulseaudio.socket”,则容器无法运行 因此,为了实现我的目标,我添加了命令“pactl load module module native protocol unix socket=/tmp/pulseaudio.socket”,以启动应用程序[通过搜索启动程序访问的GUI程序]。此命令在/tmp文件夹中创建一个pulseaudio.so

我正在运行一个docker容器,并将pulse server环境变量传递给我的容器。容器设置为“始终重新启动”策略。如果/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 native protocol unix socket=/tmp/pulseaudio.socket”
添加到/etc/rc.local,并尝试将其添加到init.d

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

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

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

或者有没有办法让docker服务首先检查 pulseaudio.socket文件存在,如果存在,则只启动 集装箱


我该怎么做?

我这样解决了这个问题:

我的容器有一个启动应用程序的节点脚本,该应用程序需要pulseaudio才能正常运行。这是我的docker运行命令。 请注意粗体代码。这就是我修改的

上一命令

sudo docker run--pid=host-dit--restart除非停止--env pulseaudio.socket--env pulseaudio.COOKIE=/home/$USER/pulseaudio.COOKIE--volume/tmp/pulseaudio.socket:/tmp/pulseaudio.socket--volume/home/$USER/pulseaudio.client.conf:/etc/PULSE/client.conf--用户$(id-u):$(id-g)--privileged--net=host ubuntu bash-c“node 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)--特权--net=host ubuntu bash-c“sh checksocket.sh&&tail-F任何东西”

在上一个命令中,仅当主机的/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脚本会不断检查mounted/tmp文件夹中的pulseaudio.socket文件,如果它存在,则只会启动我的节点服务

这样,每当我重新启动计算机时,我的容器总是启动,并且一旦shell脚本在/tmp文件夹中检测到pulseaudio.socket,节点服务就会启动

我希望这能帮助那些试图将pulseaudio与docker结合使用以实现声音多路复用或避免主机上出现“设备或资源繁忙”错误(当您将docker与alsa结合使用时,会出现设备或资源繁忙错误,因为alsa直接捕获声卡)。如果有人需要更多帮助,请告诉我