Last Monday, I was speaking at the Nantes JUG. During the presentation, I deploy a Java application on Google Compute Engine. To run the application, I use a Docker image that has Java 8 installed.
While Pierre Reliquet was giving a talk about AngularDart, I thought it was a good idea to check that the deploy part of my talk works just fine.
Guess what? It didn’t.
The docker image I used to work with is not on the compute engine instance anymore. And I remember I used this very instance to experiment a lot of things. I must have broken something. Not a problem, I decide to spawn a new instance from a disk snapshot I know is working.
I should have said “I thought was working”.
On this snapshot, Docker is installed properly but the image is not created yet. No problem, I run
docker build from the
Dockerfile to recreate a docker instance with java 8 installed.
Guess what? It didn’t work.
Turns out that a
Dockerfile is very reproductible as long as you access external resources that are still there. In my case, I use a custom package repository that used to contain early releases of Java 8. The url for these packages was moved or is not responding anymore.
# Install java8 RUN add-apt-repository -y ppa:webupd8team/java RUN apt-get update RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections RUN apt-get install -y oracle-java8-installer
Little moment of panic. My talk is to take place in 15 minutes.
One thing nice with docker is that you can run the same image on remote servers or locally. By chance, I’ve got THE image I need on my machine.
So let’s upload this image to the remote instance
It’s pretty easy. You need to dump the image to a file, upload this file, then extract the image back from the file.
local $ docker save dgageot/java8 > image.tar local $ gcutils push remote_instance image.tar . local $ gcutils ssh remote_instance remote $ docker load dgageot/java8 < image.tar
Docker saved the day!