Создайте гнездо pulseaudio при запуске системы в Ubuntu 16.04 - PullRequest
1 голос
/ 06 марта 2019

Я запускаю докер-контейнер и передаю переменную среды импульсного сервера моему контейнеру. Контейнер настроен на перезапуск всегда политики. Контейнер не запускается, если «pulseaudio.socket" отсутствует в папке / tmp .

Поэтому, чтобы достичь своей цели, я добавил команду "pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket" для запуска приложений [программа с графическим интерфейсом, доступ к которой осуществляется путем поиска программ запуска]. Эта команда создает файл pulseaudio.socket в папке / tmp

Этот метод работает большую часть времени, если файл pulseaudio.socket создан до того, как Docker запустит контейнер. Если docker запускает контейнер до создания pulseaudio.socket , контейнер не запускается.

Чтобы убедиться, что pulseaudio.socket всегда создается до того, как docker запускает контейнер, я добавил код "pactl load-module module-native-protocol-unix socket=/tmp/pulseaudio.socket" в / etc / rc.local , а также попытался добавить его в init. д . * * тысяча двадцать-пять

Но при добавлении кода в / etc / rc.local или init.d создается папка pulse-PKdhtXMmr18n в / tmp папка вместо файла pulseaudio.socket

Как сделать так, чтобы вместо pulse-PKdhtXMmr18n всегда создавался файл с именем pulseaudio.socket ?

Моя основная задача - создать файл / tmp / pulseaudio.socket до запуска docker или до того, как docker попытается запустить контейнер с политикой перезапуска.

Или есть какой-то способ, которым служба докера сначала проверяет, Файл pulseaudio.socket существует, и если он существует, только запустите контейнеры?

Как мне это сделать?

1 Ответ

1 голос
/ 06 марта 2019

Я решил проблему следующим образом:

В моем контейнере есть скрипт узла, который запускает приложение, и для правильной работы этого приложения требуется pulseaudio.Так вот моя команда запуска Docker.Обратите внимание на код, выделенный жирным шрифтом.Вот что я изменил.

Предыдущая команда

Запуск sudo docker --pid = host -dit --restart, если не остановлен --env PULSE_SERVER = unix: /tmp/pulseaudio.socket -env PULSE_COOKIE = / home / $ USER / pulseaudio.cookie - громкость /tmp/pulseaudio.socket:/tmp/pulseaudio.socket --volume /home/$USER/pulseaudio.client.conf:/etc / pulse / client.conf --user $ (id -u): $ (id -g) --privileged --net = host ubuntu bash -c " узел службы.js && tail -Fчто-нибудь "

Текущая команда

Запуск sudo docker --pid = host -dit --restart если не остановлено --env PULSE_SERVER = unix: /tmp/pulseaudio.socket --env PULSE_COOKIE =/home/$USER/pulseaudio.cookie - громкость / tmp: / tmp --volume /home/$USER/pulseaudio.client.conf:/etc/pulse/client.conf --user $(id -u): $ (id -g) --privileged --net = host ubuntu bash -c " sh checksocket.sh && tail -F что-нибудь"

в предыдущемкоманда, контейнер, используемый для запуска, только если в папке / tmp был файл pulseaudio.socketхоста.

Теперь текущая рабочая команда монтирует - том / tmp: / tmp вместо - том /tmp/pulseaudio.socket:/tmp/pulseaudio.socketКоманда

и sh checksocket.sh выполняет файл checksocket.sh, который я создал внутри контейнера.

Вот код моего файла checksocket.sh:

#!/bin/bash
while sleep 0.5;
do if [ -e /tmp/pulseaudio.socket ]
then
value="node service.js"
exec $value
break
fi
done

Этот сценарий оболочки продолжает проверять файл pulseaudio.socket в папке mount / tmp, и если он существует, то только онзапускает службу моего узла.

Таким образом, мой контейнер всегда запускается всякий раз, когда я перезагружаю свою машину, и служба узла запускается, когда сценарий оболочки обнаруживает pulseaudio.socket в папке / tmp.

Надеюсь, это поможет кому-то, ктопытаются использовать pulseaudio с докером для целей мультиплексирования звука или во избежание ошибки «устройство или ресурс заняты» (ошибка «устройство или ресурс занята» возникает при использовании докера с alsa, поскольку alsa напрямую захватывает звуковую карту) на хост-компьютере.Дайте мне знать, если кому-то понадобится дополнительная помощь

...