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.