Using Docker to test getlino

Testing getlino is quite different from testing Lino itself in that getlino is a tool that modifies the system configuration of a Linux machine. You obviously don’t want it to do this on the computer you are using for development.

Quick introduction to Docker

A Docker container is like a virtual machine, but it stores only the things that you changed after installing the image. A Docker image contains a whole operating system:.

Running inv prep in the getlino repository will build a set of Docker images needed for running the getlino test suite. You don’t need to run it before every test run, only once after each modification in the getlino source code.

  • debian_updated = a virgin Debian buster + apt upgrade + create a user “lino”

  • debian_with_getlino = debian_updated + add the current getlino source files

  • ubuntu_updated : same as debian_updated but with Ubuntu

  • ubuntu_with_getlino : same as debian_with_getlino but with Ubuntu

You can see the available docker images on your computer:

$ docker image ls
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
ubuntu_with_getlino   latest              509d56b09981        3 hours ago         513MB
debian_with_getlino   latest              a96d832cb84c        3 hours ago         598MB
ubuntu_updated        latest              4171a574c2d7        4 days ago          513MB
debian_updated        latest              f29ed368ec5d        4 days ago          598MB
ubuntu                bionic              d27b9ffc5667        2 weeks ago         64.2MB
debian                buster              1b686a95ddbf        6 weeks ago         114MB

You can run an interactive session in a docker container using one of those images:

$ docker run -it debian_with_getlino /bin/bash
lino@97621d803236:/src$

The effect of this is that you are now inside a bash session on your container. Feel free to play around:

lino@97621d803236:/src$ pwd
/src
lino@97621d803236:/src$ ls -al
total 16
drwxr-xr-x 1 lino lino 4096 Jul 27 09:50 .
drwxr-xr-x 1 root root 4096 Jul 27 11:24 ..
drwxr-xr-x 4 root root 4096 Jul 27 09:50 getlino
-rw-rw-r-- 1 root root  260 Jul 10 10:02 setup.py
lino@97621d803236:/src$ echo "Hello, world!" > hello.txt

Now hit Ctrl-D to terminate your bash session. This will put your container into the state “exited”. You can see the status of all your containers by saying:

$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED              STATUS                     PORTS               NAMES
97621d803236        debian_with_getlino   "/bin/bash"         About a minute ago   Exited (0) 5 seconds ago                       sharp_austin

Copy the name of your container (97621d803236 in this example, but yours is likely to be different) to your clipboard. Now let’s say you want to continue working on this container:

$ docker start -i 97621d803236
lino@97621d803236:/src$ cat hello.txt
Hello, world!
lino@97621d803236:/src$  # hit [Ctrl-D] to exit

As you can see, the hello.txt from your previous session is still there.

You can start a container in “detached mode”, that is, without attaching it to your terminal. The docker start command returns you immediately to the shell prompt and the container continues running in background:

$ docker start 97621d803236

You can now run one bash command at a time from the command line:

$ docker exec 97621d803236 /bin/bash -c "cat hello.txt"
Hello, world!
$

We can verify that the container is still running in the background:

$ docker ps -a
CONTAINER ID  IMAGE                COMMAND       CREATED       STATUS          PORTS  NAMES
97621d803236  debian_with_getlino  "/bin/bash"   2 hours ago   Up 10 seconds          sharp_austin

Let’s tidy up and remove our container:

$ docker container rm 97621d803236
Error response from daemon: You cannot remove a running container
97621d803236e46b66917aae8bc6fb01ea3ab3f8749e374d33a818516c833509.
Stop the container before attempting removal or force remove

Yes, we started the container in detached mode, it would run forever if we don’t stop it:

$ docker container stop 97621d803236
97621d803236

Now we can remove it:

$ docker container rm 97621d803236

What we saw here is basically all we do in our test suite. Let’s have a look at the file tests/test_docker.py

$ docker run –publish 8000:8080 –detach –name mycont getlino_debian

Docker uses much disk space

How to see how much disk space docker is using on your computer:

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              34                  5                   5.1GB               5.1GB (99%)
Containers          11                  2                   17GB                14.13GB (83%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

To get more details, you can also run:

$ docker system df -v

From time to time I tidy up and remove all rebuildable containers:

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
cdd408dc0ee130d4498c82f0eed6609445b3ae290ef21c7739ef29ceca99fbd4
493ae1128f25bc144598661eaf854de527cdc7b4795ba1a34f9e46a0aa852012
48f9d5220778b8efd7db4bb041659b9b058f993e234e770e803e4cbeb18e4124
...
Total reclaimed space: 27.53GB

Sources consulted: