Run Debian Based Programs On Almost Any Linux With Docker

I’m a Solus user (and enthusiast), but as one I also faced a common problem. Not every desktop app is available on Solus Linux and you also can’t run .deb or .rpm installation files, because Solus uses a different package manager and isn’t based on any other Linux distribution.

But my study required me to install an application called “Inform 7”. This software is available for Ubuntu, Debian and also Fedora. If you have neither of these, you need to compile it by yourself.

That’s what I first tried, but after hours of trying and getting a headache, I came to the conclusion it isn’t possible to compile this app on my laptop, because it needed a very old and deprecated library. I had to find another workaround.

One workaround was to get a virtual machine and run this app inside of this VM. But VMs are not the best solution in terms of memory usage and battery consumption. Just to run this little app, you need to run a whole Virtual Machine with at least 2 Gigabytes of memory.

One day, I got the idea, to use my Docker experience to run this app with Docker and I regret that I didn’t get this idea earlier. I built myself a script, to first build a customized Docker image and then run it. It almost looks and feels like having it installed natively. And it also uses almost no extra memory.

Here’s how to do it:

Requirements:

You need Docker installed on your system and your user should be member of the docker user group.

You should use the X11 windows manager, because that is used to bridge the application to your system.

As example of this tutorial I use the program gnome-inform7.

First, there’s the build.sh script, which first downloads the deb file and then starts the Docker build.

#!/bin/bash
URL=http://inform7.com/download/content/6M62/gnome-inform7_6M62-1_amd64.deb
wget $URL -O inform.deb
docker build . -t inform --build-arg informuser=$USER
echo "Successfully build Inform 7 image. Now you can start it by typing ./run.sh"

The script downloads the deb file with wget to the specified file name and then builds the Docker image and tags it accordingly. It also passes the username, which the Docker image should use. This is helpful, because this way your home folder can be mounted to the container and you can save files to the home folder, which will persist. All other files (outside your home folder) will be deleted after stopping the container.

Second, there’s the Dockerfile, which instructs Docker how to build the image:

FROM debian:9-slim
COPY inform.deb /tmp
ARG informuser
RUN apt-get update && dpkg -i /tmp/inform.deb || true
RUN apt-get install -y -f --no-install-recommends && rm -rf /var/lib/apt/lists/* && useradd $informuser
USER $informuser
ENV HOME /home/$informuser
CMD /usr/bin/gnome-inform7

It is based on Debian 9 slim version, because that’s the smallest image I found, which can install deb files. It first copies the downloaded installation file and then installs it. After doing that, it also adds a user with the same username as you are using to execute this build. And it specifies to run the program when starting the container.

Last, but not least, there’s the run.sh script, which starts the container. That’s the one you need to run to start the app:

#!/bin/bash
echo "Your local home folder is bind to /home/$USER"
docker run --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME:$HOME --name inform inform

It just calls the Docker run command with connecting the X11 windows manager from the host with the container X11 window manager and also mounting your home folder. When you close the application, the container gets removed. So don’t forget to save your files in your home folder before doing so!

If you want, you can also add the run.sh script to your application menu, so it’s even easier to launch that application.

With that you should be able to run deb based programs on almost any Linux (where you can install Docker and have the X11 window manager).

If you want to run a program, which is already available in the Debian packages, you can replace the install command to install the package directly.

Interactions & Comments