domingo, 13 de octubre de 2019

Crear imagen docker desde Genexus y levantara en un docker-compose


Estoy empezando a hacer las primeras pruebas con Docker y Genexus, hace ya tiempo que la infra ya la manejamos con Docker, es decir los ambientes donde deployamos los war para testing están todos “dockerisados”, pero desde el U0 de genexus 16 que estoy por probar el armar la imagen directamente desde Gx.


El primer problema que se me presento que con el U0 daba un error y no generaba la imagen, teóricamente en el U1 se solucionó, yo actualmente estoy trabajando con el U5.
Lo que hay que tener en cuenta es que tenemos que tener instalado Docker para Windows (url de descarga https://www.docker.com/products/docker-desktop, hay que tener usuario pero es gratis el registro).

Luego de la instalación de Docker, y un par de reinicios, luego vamos a genexus despues de un Rebuild All (no es necesario ya que teoricamente no cambia nada en el codigo, pero....), vamos a realizar el deploy.

Seleccionamos Docker Image, y cargamos las siguientes propiedades:
Maintainer name: tu nombre y correo electrónico si lo quieres
Docker imagen name: nombre de la imagen que tu prefieras
Environment variables: acá van las variables que tu quieras por ejemplo para conectarte la base de datos o lo que necesites, como yo utilizo java se deben de escribir de esta forma (con .net es similar pero no igual):

GX_COM_MI_APP_GAM_CS_DBNAME="nombre_de_base" GX_COM_MI_APP_GAM_USER_ID="user_bd" GX_COM_MI_APP_GAM_USER_PASSWORD="password.xxx" GX_COM_MI_APP_GAM_DB_URL="jdbc:postgresql:// nombre_conteiner_db_postgres:5432/nombre_de_base" GX_COM_MI_APP_DEFAULT_CS_DBNAME="nombre_de_base" GX_COM_MI_APP_DEFAULT_USER_ID="user_bd" GX_COM_MI_APP_DEFAULT_USER_PASSWORD="password.xxx" GX_COM_MI_APP_DEFAULT_DB_URL="jdbc:postgresql://nombre_conteiner_db_postgres:5432/nombre_de_base"

Obviamente esto se debe de adaptar al su ambiente, pero se puede cambiar en el docker-compose.yml

Luego generamos el deploy.

Lo que vemos si finaliza ok, es que se levanta la imagen a Docker, y en el log vemos que se descarga la imagen tomada como base (tomcat:9-jdk11 o la que pusieron en al armar el war)

Si quieren ya pueden en el Docker local probar la aplicación, pero en mi prueba lo voy a llevar a un server de testing que ya funciona Docker.

Se pasa la imagen generada a un .tar con el siguiente comando
$ docker save -o arch.de.mi.container.tar micontainer



Copiamos el .tar a nuestro server con Docker, y ejecutamos

$ docker load < update1.tar
$ docker images

El primer comando importa la imagen (esto lleva unos segundos dependiendo del tamaño de la imagen) y el segundo nos lista la lista de imagen en el server (usar grep para filtrar)

En mi caso yo cuento con un Docker compose, por lo tanto, armo el yml así (el archivo docker-compose.yml):

version: '3.6'
services:
  web:
    image: 'NOMBRE.DE.LA.IMAGEN:latest'
    container_name: 'nombre_del_contenedor'
         
    ports:
      - "8888:8080"
    links:
      - postgres

    expose:
      - 8888
    environment:
      - GX_COM_MI.APP_GAM_CS_DBNAME=BASE
      - GX_COM_MI.APP_GAM_USER_ID=USUARIO
      - GX_COM_MI.APP_GAM_USER_PASSWORD=CONTR
      - GX_COM_MI.APP_GAM_DB_URL=jdbc:postgresql://base_nombre_contenedor:5432/base
      - GX_COM_MI.APP_DEFAULT_CS_DBNAME=BASE
      - GX_COM_MI.APP_DEFAULT_USER_ID=USUARIO
      - GX_COM_MI.APP_DEFAULT_USER_PASSWORD=CONTR
      - GX_COM_MI.APP_DEFAULT_DB_URL=jdbc:postgresql://base_nombre_contenedor:5432/base
  
  postgres:
    image: 'postgres:9.5.6'
    container_name: 'base_nombre_contenedor'
    environment:
      POSTGRES_PASSWORD: CONTRA
      POSTGRES_USER: BASE
    volumes:
      - 'data:/var/lib/postgresql/data'
    ports:
      - '6543:5432'
    expose:
      - '6543'
volumes:
  data:

Muchas de los datos que ven acá se deben de cambiar, ejemplo el usuario y pass de la base, los nombres de los contenedores, etc. Todo debe de ser adaptado a sus entornos.
Vean que los que está bajo web. Environment son las variables que se definió al crear el contenedor, se pueden agregar o quitar las que se quiera y obviamente configurarse según sus especificaciones.
También hay cosas que pueden sobrar (ejemplo exponer postgres) o faltar dependiendo de su sistema.

Teniendo esto bien armado se puede levantar los containers de la siguiente forma:
$ cd ruta (ruta es donde está el docker-compoose.yml)
$ docker-compose up (si esta seguro que todo anda bien se pude poner -d)



Luego con acceder a http://ip.o.nombre.de.serer:8888/servlet/com.app.login (asumiendo que com.app.login es el login de la aplicación) veríamos la aplicación (obviamente si esta lleva base de datos deberíamos de hacer el restore)


Y listo, en pocos pasos tenemos la aplicación funcionando.