docker - 在 Ubuntu 16.04 系统启动时创建脉冲音频套接字

标签 docker ubuntu-16.04 audio-streaming pulseaudio

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

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

如果 ,此方法在大多数情况下都有效。 pulseaudio.socket 文件是在 docker 启动容器之前创建的。如果 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 创建一个 脉冲-PKdhtXMmr18n 中的文件夹/tmp 文件夹而不是文件 pulseaudio.socket

我如何确保而不是 脉冲-PKdhtXMmr18n , 文件名为 pulseaudio.socket 总是被创造?

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

Or is there any way such that the docker service first checks if the pulseaudio.socket file exists and if it exists then only start the containers?



我该怎么做?

最佳答案

我解决了这样的问题:

我的容器有一个启动应用程序的节点脚本,这个应用程序需要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) --privileged --net=host ubuntu bash - c " node service.js && tail -F 任何东西"

当前命令

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 任何东西"

在前面的命令中,容器仅在主机的/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一起使用以实现声音多路复用或避免“设备或资源繁忙”错误的人(当您将docker与alsa一起使用时会出现设备或资源繁忙错误,因为alsa直接捕获声卡)在主机上。如果有人需要更多帮助,请告诉我

关于docker - 在 Ubuntu 16.04 系统启动时创建脉冲音频套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55016719/

相关文章:

docker - 无法从主机连接到 dockerized Vue CLI 服务

linux - Windows 容器可以托管在 Linux 上吗?

ubuntu - 如何在 ubuntu 16.04LTS 中安装 Appium

python - HTTP实时音频流服务器

iphone - 如何使用分块编码上传数据?

audio - 跟踪并显示收听时间的音频播放器

docker 中的 Redis 多次启动/重启?

python - 带有/数据库的 Java Web 应用程序应该有多少个 docker 容器?

laravel - Ubuntu Laravel 上的 Gulp 安装错误

sql-server - 乌类图 : Silent install of mssql-tools and unixodbc-dev (automatically accept EULA)