Install Steam in a docker container using distrobox (solved)
I like to keep my main system as bare bones as possible (it is not though).
Projects that come with a plethora of libraries, I try to containerize. My
convenient mulle-dockerize
script wraps commands such as jekyll
into commands that then start and
execute a container, but it still was some work to get the Dockerfiles up.
But today I tried something different and I think my old ways may be obsolete now. The name of the possible gamechanger is distrobox.
Install stable distrobox (1.4.2.1)
I used the lazy install method, after all distrobox is just a bunch of shell scripts:
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh
Create a container/distrobox
Note
See the end of this article if you have a NVidia card.
Now let’s create an ubuntu container named “steam” to host the steam executable:
distrobox create -n steam \
--image ubuntu:latest \
-p \
--yes \
--home ~/.distrobox/steam
distrobox enter steam
I am gonna call a container managed by distrobox
a “distrobox” from here on.
Install Steam in distrobox
Now in the distrobox:
curl -L -O https://repo.steampowered.com/steam/archive/stable/steam_latest.deb
sudo dpkg --add-architecture i386
sudo apt update
sudo apt -y dist-upgrade
sudo apt -y install pciutils udev libcanberra-gtk-module
# install and fix missing dependencies afterwards
sudo dpkg -i steam_latest.deb
sudo apt -y -f install
sudo apt install libc6-i386 # libgl1:i386 libdrm2:i386 libegl1:i386 libgbm1:i386
# depends on ubuntu version seemingly
sudo apt install steam-libs-amd64 steam-libs-i386
sudo ldconfig
Export steam as a local command
The command will be available in a bin
folder of my choosing that
is reachable from the distrobox:
distrobox-export --bin `which steam` --export-path /home/nat/bin
Once it’s out there, I can move the command to any place I like.
Run steam
Now back on the host:
steam
This will also work, if the distrobox is not running anymore. The output should look something like this:
Container steam is not running.
Starting container steam
run this command to follow along:
docker logs -f steam
Starting container... [ OK ]
Installing basic packages... [ OK ]
Setting up read-only mounts... [ OK ]
Setting up read-write mounts... [ OK ]
Setting up host's sockets integration... [ OK ]
Integrating host's themes, icons, fonts... [ OK ]
Setting up package manager exceptions... [ OK ]
Setting up dpkg exceptions... [ OK ]
Setting up apt hooks... [ OK ]
Setting up sudo... [ OK ]
Setting up groups... [ OK ]
Setting up users... [ OK ]
Executing init hooks... [ OK ]
Container Setup Complete!
Unable to determine whether the expected Nvidia drivers are available.
The Steam client may have limited functionality.
steam.sh[1538712]: Running Steam on ubuntu 22.04 64-bit
steam.sh[1538712]: STEAM_RUNTIME is enabled automatically
setup.sh[1538875]: Steam runtime environment up-to-date!
steam.sh[1538712]: Steam client's requirements are satisfied
WARNING: setlocale('en_US.UTF-8') failed, using locale: 'C'. International characters may not work.
[2023-05-13 00:57:28] Startup - updater built Apr 28 2023 18:32:42
[2023-05-13 00:57:28] Startup - Steam Client launched with: '/home/nat/.distrobox/steam/.local/share/Steam/ubuntu12_32/steam'
...
Patience is a virtue here, as steam will take its time…
Then I installed one of my Linux compatible games, a small puzzler called The Tiny Bang Story. To my surprise it worked. Graphics worked without glitching, Sound worked. It was playable.
Remaining problems
X11 warnings
Though everything seems to work, I see a lot of errors like these, which presumably slow down the proceedings:
_IceTransSocketUNIXConnect: Cannot connect to non-local host myhost
Could not connect to X session manager: Could not open network socket
_IceTransSocketUNIXConnect: Cannot connect to non-local host myhost
_IceTransSocketUNIXConnect: Cannot connect to non-local host myhost
Could not connect to X session manager: Could not open network socket
Firewall problems
I have the Portmaster firewall running. If I turn it off, the process is quite snappy. But the X11 warnings remain.
And the fix!
Change /etc/X11/xinit/xserverrc
so tcp connections are accepted. (I have a
firewall, so I don’t mind):
#!/bin/sh
exec /usr/bin/X -listen tcp "$@"
Now change the steam
command, that was exported in a previous step, so
the SESSION_MANAGER
environment variable is no longer exported:
#!/bin/sh
# distrobox_binary
# name: steam
if [ ! -f /run/.containerenv ] && [ ! -f /.dockerenv ]
then
unset SESSION_MANAGER
exec /usr/local/bin/distrobox-enter -n steam -- /usr/bin/steam "$@"
else
exec /usr/bin/steam "$@"
fi
Now everything works smoothly.
This also fixes my Portmaster firewall interference problem. It doesn’t matter anymore, if the firewall is up or not!
A distrobox with explicit nvidia support
Install unstable distrobox
For this I needed a more cutting-edge version of “distrobox”:
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install \
| sudo sh -s -- --next --prefix /usr/local
Create a container/distrobox
The --privileged
flag is admittedly just some voodoo from earlier attempts,
that may or may not be needed.
distrobox create -n steam-nvidia \
--image ubuntu:latest \
--nvidia \
-p \
--additional-flags "--privileged" \
--yes \
--home ~/.distrobox/steam
distrobox enter steam-nvidia
Install Steam in distrobox
The next part is pretty much unchanged, but the command order is maybe a bit more sensible:
curl -L -O https://repo.steampowered.com/steam/archive/stable/steam_latest.deb
sudo dpkg --add-architecture i386
sudo apt update
sudo apt -y dist-upgrade
sudo apt -y install pciutils udev libcanberra-gtk-module
sudo apt -y install libc6-i386
# not needed with nvidia image nvidia/opengl:1.2-glvnd-runtime-ubuntu22.04
sudo apt -y libgl1:i386 libdrm2:i386 libegl1:i386 libgbm1:i386
# install and fix missing dependencies afterwards
sudo dpkg -i steam_latest.deb
sudo apt -y -f install
sudo ldconfig
Everything else is, as explained before.
Then I downloaded and executed Quake 2 RTX and in the console, it recognized my NVidia card. So I would call this a success.
Post a comment
All comments are held for moderation; basic HTML formatting accepted.