You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为GitLab Runner的Docker执行器配置音频输入/输出权限

GitLab Runner(Docker执行器)音频权限配置方案

问题场景

将硬件连接到作为PC的GitLab Runner(采用Docker执行器),运行需收发音频信号的硬件自动化测试。本地测试正常,但GitLab Runner环境中无法播放/接收音频,推测是Docker容器缺少音频权限配置。

可复现的CI配置

stages:
  - test

test_audio_playback:
  image: ubuntu:latest
  stage: test
  before_script:
    - apt-get update
    - apt-get install -y pulseaudio-utils pulseaudio dbus-x11 sudo alsa-utils
    - useradd -m pulseuser
    - mkdir -p /run/user/1000/pulse
    - chown pulseuser:pulseuser /run/user/1000/pulse
    - export PULSE_SERVER=unix:/run/user/1000/pulse/native
    - ln -s /run/user/1000/pulse /tmp/pulse
  script:
    - sudo -u pulseuser pulseaudio --start --exit-idle-time=-1
    - ls /usr/share/sounds/alsa/
    - sudo -u pulseuser paplay /usr/share/sounds/alsa/Front_Center.wav

当前Runner挂载配置(/etc/gitlab-runner/config.toml)

volumes = ["/cache", "/dev:/dev:rw", "/ratatat/config:/ratatat/config:ro"]

本地Docker测试成功的配置

Dockerfile:

FROM ubuntu:latest
RUN apt-get update && \
 apt-get install -y pulseaudio alsa-utils

CMD ["/bin/bash"]

运行命令:

sudo docker run -it --rm  -e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native  -v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native  -v ~/.config/pulse/cookie:/root/.config/pulse/cookie <your-image-name>

容器内执行paplay /usr/share/sounds/alsa/Front_Center.wav可正常发声。


解决方案

1. 更新GitLab Runner的config.toml配置

修改[[runners]]段下的volumes和environment,添加PulseAudio相关挂载与环境变量:

[[runners]]
  # 保留原有其他配置
  environment = ["PULSE_SERVER=unix:/run/user/1000/pulse/native"]  # 替换1000为你的宿主机用户UID
  volumes = [
    "/cache",
    "/dev:/dev:rw",
    "/ratatat/config:/ratatat/config:ro",
    "/run/user/1000/pulse/native:/run/user/1000/pulse/native",  # 对应宿主机PulseAudio socket路径
    "/home/your-username/.config/pulse/cookie:/root/.config/pulse/cookie"  # 替换为你的宿主机用户home路径
  ]

2. 简化CI作业脚本

无需在容器内启动独立的Pulseaudio服务,直接复用宿主机的PulseAudio服务,修改.gitlab-ci.yml:

stages:
  - test

test_audio_playback:
  image: ubuntu:latest
  stage: test
  before_script:
    - apt-get update
    - apt-get install -y pulseaudio-utils alsa-utils
  script:
    - paplay /usr/share/sounds/alsa/Front_Center.wav

3. 验证与生效

  • 检查宿主机/etc/pulse/default.pa中是否包含load-module module-native-protocol-unix(默认已配置,cookie挂载会自动处理认证)。
  • 重启GitLab Runner服务:
    sudo gitlab-runner restart
    

原理说明

原CI脚本在容器内启动了独立的Pulseaudio实例,但该实例无法直接访问宿主机的音频硬件。通过挂载宿主机的PulseAudio socket和认证cookie,让容器直接连接宿主机的Pulseaudio服务,从而获得音频硬件的访问权限,与本地Docker测试的逻辑一致。

内容的提问来源于stack exchange,提问作者Nassour Nassour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:29:52