首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在docker容器中使用音频运行应用程序

在docker容器中使用音频运行应用程序
EN

Stack Overflow用户
提问于 2015-03-11 11:41:07
回答 4查看 44.2K关注 0票数 42

这个问题是由你能在一个码头容器中运行GUI应用程序吗?提出的。

其基本思想是运行带有音频和ui的应用程序(vlc、firefox、skype、.)

我在寻找使用脉冲音频的码头容器,但是我找到的所有容器都是在tcp上使用脉冲音频流的。(应用程序的安全沙箱)

在我的例子中,我会先播放容器内的应用程序的音频,直接播放到我的主机脉冲音频。(没有ssh隧道和臃肿的码头图像)

因为我的qt应用程序正在使用它;)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-11 11:41:07

我花了一段时间才发现需要什么。(Ubuntu)

我们从docker命令docker run -ti --rm myContainer sh -c "echo run something"开始。

ALSA:

我们需要像看起来那样的/dev/snd和一些硬件访问。当我们把这些放在一起的时候

代码语言:javascript
运行
复制
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标志的新的停靠版本中,您应该使用以下命令:

代码语言:javascript
运行
复制
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 (我不确定这一点)。

代码语言:javascript
运行
复制
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
  • 使用此id创建一个停靠用户

创建用户脚本:

代码语言:javascript
运行
复制
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
票数 40
EN

Stack Overflow用户

发布于 2015-03-11 19:22:48

受您发布的链接的启发,我能够创建以下解决方案。它是我所能得到的最轻巧的。但是,我不确定它是否(1)安全,(2)完全适合您的用例(因为它仍然使用网络)。

  1. 在主机系统上安装paprefs,例如在Ubuntu计算机上使用sudo apt-get install paprefs
  2. 启动PulseAudio首选项,转到"Network“选项卡,并选中”启用网络访问本地声音设备“复选框1
  3. 重新启动计算机。(只在Ubuntu14.10上重新启动Pulse音频对我没有作用)
  4. 在容器中安装Pulse音频,例如sudo apt-get install -y pulseaudio
  5. 在容器中运行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音频端口。
  6. 就这样。如果IP地址和Pulse音频端口可能会发生更改,则可能会自动执行第5步。此外,我不确定Docker是否永久存储环境变量,如PULSE_SERVER:如果没有,则必须在每个容器启动后对其进行初始化。

让我的方法更好的建议将受到极大的赞赏,因为我目前正在处理与OP类似的问题。

参考文献:

1

2

更新(可能还有更好的解决方案):

这还可以使用Unix套接字而不是TCP套接字:

  1. 使用-v /run/user/$UID/pulse/native:/path/to/pulseaudio/socket启动容器
  2. 在容器中,运行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;但是,我还没有测试过这一点。

票数 8
EN

Stack Overflow用户

发布于 2015-04-27 10:38:12

在尝试了这里描述的大多数解决方案之后,我发现只有基于网络的PulseAudio才能真正发挥作用。但是,您可以通过保留身份验证来确保它的安全性。

  1. 安装(在主机上): $apt-获取安装
  2. 启动paprefs (PulseAudio首选项)> Network >X启用对本地声音设备的网络访问。
  3. 重新启动PulseAudio: $ service脉冲音频重新启动
  4. 检查它是否正常工作或重新启动机器: $ (pax11publish \ xprop -root PULSE_SERVER) \ grep -Eo 'tcp:^ *‘tcp:myhostname:4713

现在使用这个套接字:

代码语言:javascript
运行
复制
$ 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

要测试它的工作原理:

代码语言:javascript
运行
复制
$ apt-get install mplayer
$ mplayer /usr/share/sounds/alsa/Front_Right.wav

有关更多信息,请查看码头莫皮迪项目。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28985714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档