📤
Dockerコンテナ上のGUIアプリで音を出す(Linux)
前提
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