Fullmenu null

 

09 October 2017

Al igual que con Java, Groovy cuenta desde hace un tiempo con una imagen oficial (bueno, en realidad varias, una para cada versión de JDK disponible) lo que hace que posible que se puedan ejecutar proyectos y scripts en este lenguaje dentro de un contenedor Docker, crear/extender tus imagenes, compartir volúmenes, etc.

El proyecto se encuentra alojado en https://github.com/groovy/docker-groovy y la(s) imagen(es) las puedes encontrar en el repo oficial de docker https://hub.docker.com/_/groovy/

GroovyShell

En su forma más simple el ejecutar un contenedor con cualquiera de estas imágenes nos iniciará una shell de Groovy (lo cual no tiene mucha utilidad en sí mismo):

docker run --rm -it groovy:latest groovy //(1)
  1. Obviamente necesitarás tener instalado Docker en tu sistema (ya tardas) para poder ejecutar el comando.

Lo interesante es que en ese momento estás ejecutando un contenedor de docker con groovy instalado y con todas las características de cualquier contenedor: network, volúmenes, incluirlo en un docker-compose, etc.

Hello Docker

En el siguiente ejemplo vamos a comprobar que efectivamente se ejecuta en un contenedor mediante un HolaDocker:

docker run --rm -e hola=caracola -it groovy:latest groovy -e "println System.getenv().each{println it}"

Si el comando se ejecuta correctamente deberías ver en consola las variables de entorno propias del contenedor incluida la que proporcionamos por argumento. Por ejemplo HOSTNAME indicará el nombre que le ha asignado docker a tu imagen (y que no encontrarás después porque le hemos indicado con el argumento rm que la elimine al finalizar)

Montando volumen

Una de las características propias de Docker es permitirte montar un directorio del host como si fuera propio del contenedor, de tal forma que este pueda leer/escribir en el mismo sin importar que una vez finalizado eliminemos el contenedor.

Si aprovechamos esta característica podemos ubicar nuestros scripts en un directorio del host e indicar al contenedor que los ejecute en su entorno. Para ello nos descargamos el script /scripts/docker/DockerBasico.groovy en un directorio de nuestra maquina y ejecutamos desde ese directorio:

docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts groovy:latest groovy DockerBasico.groovy -a //(1)

<1>Este script ejecuta diferentes acciones según el parámetro que le pasemos. Con -a vuelca las variables de sistema

Este script simplemente ejecuta:

if (options.a) {
    println "------------------------------------------------------------------"
    println "Hello"
    System.getenv().each{
        println it
    }
    println "------------------------------------------------------------------"
}

Si todo se ejecuta correctamente obtendrás una salida muy parecida a la del ejemplo anterior (casi seguro que HOSTNAME no coinciden y la variable hola no aparece)

Consumir JSON

Como un ejemplo más elaborado vamos a realizar una petición a un servicio externo que nos devolverá un JSON el cual indica de forma aleatoria la URL a una imagen de perros (Para más información consultar el API https://dog.ceo/dog-api)

Para ello ejecutaremos:

docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts groovy:latest groovy DockerBasico.groovy -d //(1)

<1>El parámetro -d ejecuta la acción de recuperar el JSON y descargar la imgen

Este script simplemente ejecuta:

if( options.d){
   def json = new groovy.json.JsonSlurper().parse(new URL("https://dog.ceo/api/breed/hound/images/random") )
   if(json.status=='success'){
	 new File('perrito.jpg').bytes =  new URL(json.message).bytes
   }
}

Si el script se ejecuta correctamente deberías tener un fichero nuevo en tu directorio perrito.jpg que se regenera con una imagen nueva cada vez que ejecutes el script.


Script
def cli = new CliBuilder(usage: 'groovy DockerBasico.groovy]')

cli.with { // (1)
     h(longOpt: 'help',    'Usage Information \n', required: false)
     a(longOpt: 'Hello','Al seleccionar "a" te saludara ', required: false)
     d(longOpt: 'Dogs', 'Genera imagenes de perros', required:false)
}

def options = cli.parse(args)

if (!options || options.h) {
    cli.usage
    return
}

//tag::hello[]
if (options.a) {
    println "------------------------------------------------------------------"
    println "Hello"
    System.getenv().each{
        println it
    }
    println "------------------------------------------------------------------"
}
//end::hello[]

//tag::dogs[]
if( options.d){
   def json = new groovy.json.JsonSlurper().parse(new URL("https://dog.ceo/api/breed/hound/images/random") )
   if(json.status=='success'){
	 new File('perrito.jpg').bytes =  new URL(json.message).bytes
   }
}
//end::dogs[]