📤

Dockerコンテナ上のGUIアプリで音を出す(Linux)

2021/12/11に公開

前提

Dockerインストール済みのLinux

概要

以下の関連記事がありますので、必要なものを参照してください。
Dockerコンテナ上でGUIアプリを表示する(Linux)

準備

  • bashで実行することを想定
  • ホストマシンにログインしているユーザのIDを確認し「ARG UID」に記載(デフォルト:1000)
  • イメージ名を決める(デフォルト:firefox_container)

イメージ作成

Dockerfileを準備

host bash
touch Dockerfile
vim Dockerfile
Dockerfile
FROM ubuntu:latest

ENV DEBIAN_FRONTEND noninteractive

ARG UID=1000 # ホストのユーザーIDと一致させる

RUN sed -i.org -e 's|ports.ubuntu.com|jp.archive.ubuntu.com|g' /etc/apt/sources.list \
    && apt-get update && apt-get install -y \
       pulseaudio \
       firefox \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && useradd -m -u ${UID} user

イメージをビルド

host bash
docker build -t firefox_container .

起動

host bash
docker run \
  --net=bridge \
  --shm-size=4096m \
  --rm \
  -t \
  -e DISPLAY \
  -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 \
  -e PULSE_COOKIE=/tmp/pulse/cookie \
  -e PULSE_SERVER=unix:/tmp/pulse/native \
  -v /run/user/1000/pulse/native:/tmp/pulse/native \
  -v ~/.config/pulse/cookie:/tmp/pulse/cookie:ro \
  -u `id -u` \
  firefox_container firefox

これでコンテナ内のfirefoxが起動でき、youtube等で音声が出ます。

解説

要点

pulse audioのソケットを共有する

起動コマンドの以下の部分が該当します。

host bash
  -e PULSE_SERVER=unix:/tmp/pulse/native \
  -v /run/user/1000/pulse/native:/tmp/pulse/native \

pulse audioのunixドメインソケットをバインドして共有します。
そして「$PULSE_SERVER」でその場所を教えます。

pulse audioの認証のためのcookieを共有する

起動コマンドの以下の部分が該当します。

host bash
  -e PULSE_COOKIE=/tmp/pulse/cookie \
  -v ~/.config/pulse/cookie:/tmp/pulse/cookie:ro \

認証のためにcookieファイルをバインドして共有し、「$PULSE_COOKIE」でその場所を教えます。

Dockerfile解説

Dockerfile
FROM ubuntu:latest

ENV DEBIAN_FRONTEND noninteractive

ARG UID=1000 # ホストのユーザーIDと一致させる
# ミラーの向き先を国内に向ける
RUN sed -i.org -e 's|ports.ubuntu.com|jp.archive.ubuntu.com|g' /etc/apt/sources.list \
    && apt-get update && apt-get install -y \
       pulseaudio \ # 音を出すためにpulse audioをインストール
       firefox \ # テストのためにfirefoxをインストール
    && apt-get clean \ # キャッシュ削除
    && rm -rf /var/lib/apt/lists/* \ # キャッシュ削除
    && useradd -m -u ${UID} user # 一般ユーザ追加

起動コマンド解説

host bash
docker run \
  --net=bridge \ # ネットワークモード
  --shm-size=4096m \ # メモリサイズ
  --rm \ # コンテナ終了時削除
  -t \ # tty
  -e DISPLAY \ # X サーバ名(画面表示)
  -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 \  # X サーバソケット(画面表示)
  -e PULSE_COOKIE=/tmp/pulse/cookie \ # 環境変数で認証ファイルを伝える
  -e PULSE_SERVER=unix:/tmp/pulse/native \ # 環境変数でソケットファイルを伝える
  -v /run/user/1000/pulse/native:/tmp/pulse/native \ # ソケットを共有する
  -v ~/.config/pulse/cookie:/tmp/pulse/cookie:ro \ # 認証ファイルを共有する
  -u `id -u` \ #  ホスト側のユーザIDと同じユーザIDを指定する
  firefox_container firefox # イメージ名とコマンドを指定する

Discussion