🎵
WSL2上のDockerコンテナから音を再生する
これはなに
WSL2上のDockerコンテナ内から音を鳴らすときに必要な設定のメモ。
解決したい問題
何も設定せずにWSL2上のDockerコンテナ内から音を鳴らそうとすると、下記のようなエラーが発生する。
$ aplay /usr/share/sounds/alsa/Front_Center.wav
ALSA lib confmisc.c:855:(parse_card) cannot find card '0'
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_card_inum returned error: No such file or directory
ALSA lib confmisc.c:422:(snd_func_concat) error evaluating strings
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1334:(snd_func_refer) error evaluating name
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5703:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2666:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:831: audio open error: No such file or directory
ただし、再生するファイルは存在するものとする。
$ ls -a /usr/share/sounds/alsa/
. Front_Center.wav Front_Right.wav Rear_Center.wav Rear_Right.wav Side_Right.wav
.. Front_Left.wav Noise.wav Rear_Left.wav Side_Left.wav
結論 | 解決策
WSL2上のDockerコンテナ内から音を再生するのに必要な設定は下記3つである。
- Dockerコンテナに
pulseaudio
をインストールする - Dockerコンテナで
/mnt/wslg/
をマウントする - 環境変数
PULSE_SERVER
を設定する
Dockerfileの設定
Dockerfile
でpulseaudio
をインストールする。
今回は音の再生にaplay
を使うため、alsa-utils
もインストールする。
Dockerfile
FROM debian:bookworm-slim
ARG USERNAME=user
# `pulseaudio`をインストールする
# `aplay`のために`alsa-utils`もインストールしている
RUN apt-get update -y \
&& DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends \
pulseaudio \
alsa-utils \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN useradd -m -s /bin/bash $USERNAME
WORKDIR /home/$USERNAME/workspace
USER $USERNAME
ENTRYPOINT ["/bin/bash"]
環境変数とボリュームの設定
Dockerコンテナを起動するときに環境変数PULSE_SERVER
を設定する。
また、Dockerコンテナで/mnt/wslg/
をマウントする。
docker run -it --rm -e PULSE_SERVER=${PULSE_SERVER} -v /mnt/wslg/:/mnt/wslg/ <image>
Docker composeを使う場合は、下記のように記述する。
compose.yaml
services:
app:
build:
context: .
dockerfile: ./Dockerfile
volumes:
- /mnt/wslg/:/mnt/wslg/
environment:
- PULSE_SERVER=${PULSE_SERVER}
上記の設定は、Dockerコンテナ内で音を再生したときに、WSL2のPulseAudioサーバーへアクセスできるようにするためのものである。こうすることで、WSL2上のDockerコンテナ内から音を再生すると、ホストPCから音が出るようになる。
音を鳴らしてみる
Dockerコンテナ内で音を再生してみる。下記コマンドで音が鳴るはずである。
aplay /usr/share/sounds/alsa/Front_Center.wav
おわりに
今回の検証コード一式をGitHubにアップロードしている。
Discussion