Payara creando imagen productiva

La última parte de este pequeño ejemplo, es poner todo en conjunto y pues dejar la version que todo el mundo usará, para eso tendremos como dependencia a Docker. Asumo que ya lo tienes instalado. El proyecto web que creamos la vez anterior ya tiene un comando que nos permite crear los bundles finales tanto de css como de js. Desde la terminal y en la carpeta del proyecto Payara-client ejecutamos:

npm run compile

En la carpeta dist se crearan los archivos, se debe copiar todo el contenido incluido el html en la carpeta src/main/webapp del proyecto Payara-kotlin (importante: el proyecto Payara-kotlin usa localhost en la base de datos deberas actualizar la ip y puerto de la base en produccion). Ya que copiamos los archivos en la carpeta del proyecto Payara-kotlin desde la terminal ejecutamos:

gradle war

Ahora bien necesitamos una carpeta nueva desde donde vamos a construir nuestra imagen docker. En la carpeta ponemos nuestro war que sale de ejecutar gradle war y agregamos dos archivos Dockerfile y .dockerignore el contenido de Dockerfile sera el siguiente:

FROM payara/micro
COPY PayaraMicro-0.0.1.war $DEPLOY_DIR

Que no es mas que tomar la imagen oficial de payara micro, copiar nuestro war y pegarlo en la carpeta deploy. El archivo .dockerignore funciona igual que .gitignore pero para docker, de momento no tenemos nada que ignorar así que no escribimos nada en ese archivo.

Ahora nos vamos a la carpeta que acabamos de crear y desde la terminal ejecutamos:

docker build .

Empezara a descargar la imagen de payara/micro y al final deberá salir algo así:

Step 1/2 : FROM payara/micro
latest: Pulling from payara/micro
8e3ba11ec2a2: Pull complete
2146c373b466: Pull complete
80c25b7e741b: Pull complete
94cf90afe534: Pull complete
c24d396a1991: Pull complete
Digest: sha256:d900fbacc5b5bc8d909a3e03ffc16d9c8222437298e1da607ecc8875ab25cf17
Status: Downloaded newer image for payara/micro:latest
 ---> 1c17511c5884
Step 2/2 : COPY PayaraMicro-0.0.1.war $DEPLOY_DIR
 ---> f4a007e9908b
Successfully built f4a007e9908b

Y listo nuestra imagen esta lista, la podemos publicar a Docker hub con docker push y usarla en nuestra nube local, en kubernetes con google cloud o donde se te antoje (siempre que soporten docker images).

Notas

La parte de network pues ya dependerá de como este tu infraestructura, por ejemplo en google cloud necesitas actualizar el archivo kubectl y cambiar el jdbcurl a algo asi:

 "jdbc:mysql://google/%s?cloudSqlInstance=%s"
        + "&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false"

Para correrlo localmente, en el archivo config/DBConfig.kt en lugar de localhost, pon la ip de tu maquina, en mi caso es 10.237.104.24, por lo que url de jdbc queda jdbc:mysql://10.237.104.24:3306/questions?serverTimezone=UTC&useSSL=false, vuelve a crear el war, la imagen docker y finalmente ejecuta en la terminal

docker container run --rm -p 8080:8080 --name payaraserver f4a007e9908b

Checa que el numero de la imagen sea el mismo de la imagen que creaste, no copies tal cual el comando anterior, listo cuando volvamos a entrar a http://localhost:8080/PayaraMicro-0.0.1/index.html veremos nuestra aplicación de preguntas corriendo alegremente.

Siguientes pasos: como bien sabemos falta agregar monitoreo, manejo de errores y demás cosas que son necesarias para garantizar la calidad de nuestro producto, sin embargo eso esta fuera de esta pequena serie de ejemplos, pero puedes tomar como base todo esto para crear tus propias imagenes de docker. También falta incluir un sistema de CI, por ahi esta blue ocean de jenkins que es casi casi arrastrar y soltar para no compilar, crear imagenes y desplegar manualmente cada que hacemos un cambio.