it took me some time until i found out what is needed. (Ubuntu)
we start with the docker run command docker run -ti --rm myContainer sh -c "echo run something"
ALSA:
we need /dev/snd
and some hardware access as it looks like.
when we put this together we have
docker run -ti --rm
-v /dev/snd:/dev/snd
--lxc-conf='lxc.cgroup.devices.allow = c 116:* rwm'
myContainer sh -c "echo run something"`
In new docker versions without lxc flags you shoud use this:
docker run -ti --rm
-v /dev/snd:/dev/snd
--privileged
myContainer sh -c "echo run something"`
PULSEAUDIO:
update: it may be enought to mount the pulseaudio socket within the container using -v option. this depends on your version and prefered access method. see other answers for the socket method.
Here we need basically /dev/shm
, /etc/machine-id
and /run/user/$uid/pulse
. But that is not all (maybe because of Ubuntu and how they did it in the past). The envirorment variable XDG_RUNTIME_DIR
has to be the same in the host system and in your docker container. You may also need /var/lib/dbus
because some apps are accessing the machine id from here (may only containing a symbolic link to the 'real' machine id). And at least you may need the hidden home folder ~/.pulse
for some temp data (i am not sure about this).
docker run -ti --rm
-v /dev/shm:/dev/shm
-v /etc/machine-id:/etc/machine-id
-v /run/user/$uid/pulse:/run/user/$uid/pulse
-v /var/lib/dbus:/var/lib/dbus
-v ~/.pulse:/home/$dockerUsername/.pulse
myContainer sh -c "echo run something"
In new docker versions you might need to add --privileged
.
Of course you can combine both together and use it together with xServer
ui forwarding like here: https://stackoverflow.com/a/28971413/2835523
Just to mention:
- you can handle most of this (all without the used id) in the
dockerfile
- using
uid=$(id -u)
to get the user id and gid with id -g
- creating a docker user with this id
create user script:
mkdir -p /home/$dockerUsername &&
echo "$dockerUsername:x:${uid}:${gid}:$dockerUsername,,,:/home/$dockerUsername:/bin/bash" >> /etc/passwd &&
echo "$dockerUsername:x:${uid}:" >> /etc/group &&
mkdir /etc/sudoers.d &&
echo "$dockerUsername ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$dockerUsername &&
chmod 0440 /etc/sudoers.d/$dockerUsername &&
chown ${uid}:${gid} -R /home/$dockerUsername
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…