I needed to get compiz on the machine (bug 1223123), and I thought it should be on the base image. So to take the path of most resistance, I dove deep into the internals of taskcluster/docker and figured this out. To be fair, :ahal gave me a lot of pointers, in fact if I would have taken better notes this might have been a single pass to success vs. 3 attempts.
First let me explain a bit about how the docker image is defined and how it is referenced/built up. We define the image to use in-tree. In this case we are using taskcluster/docker-test:0.4.4 for the automation jobs. If you look carefully at the definition in-tree, we have a Dockerfile which outlines who we inherit the base image from:
FROM taskcluster/ubuntu1204-test-upd:0.1.2.20151102105912
This means there is another image called ubuntu1204-test-upd, and this is also defined in tree which then references a 3rd image, ubuntu1204-test. These all build upon each other creating the final image we use for testing. If you look in each of the directories, there is a REGISTRY and a VERSION file, these are used to determine the image to pull, so in the case of wanting:
docker pull taskcluster/desktop-test:0.4.4
we would effectively be using:
docker pull {REGISTRY}/desktop-test:{VERSION}
For our use case, taskcluster/desktop-test is defined on hub.docker.com. This means that you could create a new version of the container ‘desktop-test’ and use that while pushing to try. In fact that is all that is needed.
First lets talk about how to create an image. I found that I needed to create both a desktop-test and an ubuntu1204-test image on Docker Hub. Luckily in tree there is a script build.sh which will take a currently running container and make a convenient package ready to upload, some steps would be:
- docker pull taskcluster/desktop-test:0.4.4
- docker run taskcluster/desktop-test:0.4.4
- apt-get install compiz; # inside of docker, make modifications
- # now on the host we prepare the new image (using elvis314 as the docker hub account)
- echo elvis314 > testing/docker/docker-test/REGISTRY
- echo 0.4.5 > testing/docker/docker-test/VERSION # NOTE: I incremented the version
- cd testing/docker
- build.sh docker-test # go run a 5K
- docker push elvis314/docker-test # go run a 10K
those are the simple steps to update an image, what we want to do is actually verify this image has what we need. While I am not an expert in docker, I do like to keep my containers under control, so I do a |docker ps -a| and then |docker rm <cid>| for any containers that are old. Now to verify I do this:
- docker pull elvis314/desktop-test:0.4.5
- docker run elvis314/desktop-test:0.4.5
- compiz # this verifies my change is there, I should get an error about display not found!
I will continue on here assuming things are working. As you saw earlier, I had modifed filed in testing/docker/desktop-test, these should be part of a patch to push to try. In fact that is all the magic. to actually use compiz successfully, I needed to add this to test-linux.sh to launch |compiz &| after initializing Xvfb.
Now when you push to try with your patch, any tasks that used taskcluster/desktop-test before will use the new image (i.e. elvis314/desktop-test). In this case I was able to see the test cases that opened dialogs and windows pass on try!