lunes, marzo 21, 2016

Usando Docker para crear máquinas virtuales ubuntu debian para testing - Crear una imagen a medida

En la anterior entrada sobre docker ya me llevé una grata sorpresa de cómo descargar y usar una imagen limpia de Ubuntu 14.04 en unos segundos con que la poder testear un script para la compilación de las últimas versiones de libgphoto2.

El principal problema era que en cada ocasión tenía que instalar git en el contenedor descargado y posteriormente clonar el proyecto git con su rama correspondiente y lanzar manualmente el script. Dado que además quería probar el script en Debian 7 y 8 resultaba en que tenía que hacer muchas acciones manuales.

He  tenido tiempo de sentarme a mirarlo con más detenimiento y resulta muy fácil crear una imagen personalizada partiendo de una base oficial como ubuntu o debian a la que posteriormente puedo añadir una serie de comandos personalizados para que agilice la ejecución.

El objetivo es que finalmente se me quede un único script en el que yo pueda ejecutar  "probar-en [SO deseado] [direccion de la rama git que quiero probar]". En cada ocasión el contenedor será una imagen limpia de ubuntu/debian/raspbian que sólo tendrá instalado git.

Empezamos creando la imagen personalizada de Ubuntu 14.04 con los añadidos para ejecutar los tests. Lo hacemos en dos pasos:
  • Crearmos un dockerfile, que especifica las características de la imagen que queremos crear y generándola
  • Añadimos la funcionalidad para que descargue la rama y la ejecute
Creando el container básico
Creamos una carpeta específica para el proyecto y dentro de ella un archivo llamado "Dockerfile" con el siguiente contenido indicando cual es la imagen base que vamos a tomar y el añadido que le queremos ahcer


   FROM ubuntu:14.04
   RUN apt-get -y update && apt-get install -y git

Guardamos y generamos la imagen con 

   docker build -t ubuntu-14.04-git .

El nombre ubuntu-14.04-git será el nombre de la imagen que figurará en nuestros respositorio local. Una vez finaliza la ejecución podemos comprobar que se ha generado correctamente con:

   $ docker images
   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   ubuntu-14.04-git    latest              d9adeb8df631        21 minutes ago      247.5 MB

Si accedemos a la imagen con "docker run -ti ubuntu-14.04-git /bin/bash" accederemos a la línea de comandos y podremos comprobar que es una imagen limpia con el git recien instalado.

Añadiendo el script de descarga y compilación
En mi caso quiero que el container este listo para que con un sólo comando se descargue un repositorio git y ejecute el script correspondiente. Así pues voy a crear un script de shell que haga todo eso para copiarlo dentro del container y que se ejecute al lanzarlo. 

En la misma carpeta donde tenemos el Dockerfile añadimos un fichero llamado test-script.sh con el siguiente contenido:

   #!/usr/bin/env bash
   git clone $1
   cd gphoto2-updater
   ./gphoto2-updater.sh

Como puedes ver es bastante obvio lo que hacer: recibe por parámetro una URL de un repositorio git, lo descarga, accede a la carpeta y lanza el comando.

Modificamos el Dockerfile con el siguiente contenido:

   FROM ubuntu:14.04
   RUN apt-get -y update && apt-get install -y git
   COPY ./test-script.sh /

... y generamos de nuevo la imagen para que añada el fichero al sistema de archivos...

   docker build -t ubuntu-14.04-git .

tardará sólo un momento y la imagen estará lista para trabajar. Cada vez que quiera probar una nueva rama de mi script basta con que lance:

   docker run -rm -ti ubuntu-14.04-git /test-script.sh [URL de la rama GIT para probar]

...y tendré un container limpio de ubuntu 14.04 con el git instalado que directamente descargará la rama git indicada y lanzará el script de compilación. Una vez finalice saldrá y el flag rm borrará el container que se acababa de generar sin que queden rastros de la ejecución. 

En mi caso he creado una alias para el comando anterior en el que reduzco el comando a 

   $test-ubuntu.sh [url proyecto git]

Partiendo de esta base es muy sencillo crear imágenes similares para debian 7 y 8 e incluso un script genérico para que lance los test sobre todos los SO que quiera.

Creando un dockerfile para cada SO
Muy sencillo, podemos crearlos todos en la misma carpeta añadiendo un sufijo al Dockerfile (como por ejemplo Dockerfile-debian-7) y luego personalizamos la llamada al docker build como sigue:

   docker build -t debian-7-git -f Dockerfile-debian-7 .

Generará una imagen con la etiqueta debian-7-git. Ahora sí, revisando los alias puedo lanzar el testing de un rama GIT sobre un SO limpio con algo tan simple como:

   $ ./test-os.sh debian-7-git https://github.com/gonzalo/gphoto2-updater.git
   $ ./test-os.sh debian-8-git https://github.com/gonzalo/gphoto2-updater.git
   $ ./test-os.sh ubuntu-14.04-git https://github.com/gonzalo/gphoto2-updater.git
   $ ./test-os.sh raspbian-8-git https://github.com/gonzalo/gphoto2-updater.git





No hay comentarios:

Publicar un comentario