我正在运行一个 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并尝试将其添加到初始化文件。
但添加代码到/etc/rc.local或者初始化文件创建一个脉冲-PKdhtXMmr18n文件夹中/tmp文件夹而不是文件pulseaudio.socket
我如何确保脉冲-PKdhtXMmr18n,文件名为pulseaudio.socket总是被创造吗?
我的主要目标是创造/tmp/pulseaudio.socket在 docker 启动之前或在 docker 尝试使用重启策略启动容器之前文件。
我该怎么做?
答案1
我这样解决了这个问题:
我的容器有一个启动应用程序的节点脚本,并且该应用程序需要 pulseaudio 才能正常运行。这是我的 docker run 命令。请注意粗体代码。这就是我修改的内容。
上一个命令
sudo docker run --pid=host -dit --restart except-stopped --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 --用户$(id -u):$(id -g) --privileged --net=host ubuntu bash -c "节点服务.js&& tail -F 任何东西”
当前命令
sudo docker run --pid=host -dit --restart except-stopped --env PULSE_SERVER=unix:/tmp/pulseaudio.socket --env PULSE_COOKIE=/home/$USER/pulseaudio.cookie–卷/tmp:/tmp--volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --用户$(id -u):$(id -g) --privileged --net=host ubuntu bash -c "sh 检查socket&& tail -F 任何东西”
在上面的命令中,仅当主机的 /tmp 文件夹中存在 pulseaudio.socket 文件时,容器才会启动。
现在当前工作命令挂载–卷/tmp:/tmp代替--volume /tmp/pulseaudio.socket:/tmp/pulseaudio.socket
和sh 检查socket命令执行我在容器内创建的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 直接捕获声卡)的人。如果有人需要更多帮助,请告诉我