Docker para desarrollar con tomcat

Las ventajas de utilizar docker para desarrollar y desplegar la aplicaciones nunca deja de sorprenderme. Conseguimos con una simple definición en texto crear máquinas con configuraciones exactas a ejecutar en todas partes. Una de las cosas en donde todavía no había aplicado docker es en la aplicaciones web que desarrollo en Java. Habitualmente se requiere de un servidor tomcat (con cierta versión de máquina virtual de java) y una base de datos (yo he trabajado con mysql mayoritariamente) con otra versión particular.

Dado que las versiones de base de datos y de tomcat y de java han sido muy variables con el tiempo y que los proyectos no solo hay que desarrollarlos y entregarlos sino que hay que mantenerlos, nos encontramos con una situación imposible en que cualquier combinación de estos elementos es posible y necesaria para probar cualquier mínimo cambio que queramos realizar (si hay cosas muy compatibles que se pueden hacer con versiones nuevas y muchas otras que no)… El caso es que esta vez voy a deciros cómo podemos olvidarnos de una vez por todas de estos problemas utilizando docker y docker-compose.

Si eres el desgraciado usuario de una versión de windows las cosas pueden ser un poco más complicadas, pero si usas un sistema operativo de verdad la instalación y puesta en marcha de docker es trivial e inmediata (ya lo he tratado antes en el blog). Voy a dar por hecho que ya tienes un proyecto Java a ejecutar con tomcat (si es con maven o gradle que te generen el .war automáticamente, mejor) y que ya tienes docker instalado en tu equipo (y docker-compose). Lo que sigue es lo que tienes que hacer para probar tu war en un tomcat con una versión determinada que use una base de datos de una versión determinada:

Crea un directorio docker al mismo nivel que tienes el pom.xml si usas maven y dentro de ese directorio crea el archivo docker-compose.yml

version: "3"
services:

  tomcat:
    container_name: miproyecto-tomcat
    image: tomcat:8-jdk8
    ports:
      - 8080:8080
    volumes:
      - ../target/miproyecto.war:/usr/local/tomcat/webapps/miproyecto.war
      - ../target/miproyecto:/usr/local/tomcat/webapps/miproyecto
    links:
      - "mysql:db"

  mysql:
    container_name: miproyecto-mysql
    image: mysql:8.0
    environment:
       MYSQL_ROOT_PASSWORD: "mipassword"
    volumes:
      - ../mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: unless-stopped

En el directorio del pom.xml ejecuta lo siguiente:

mvn package

Esto te genera el war dentro de target y ya estarás en disposición de entrar dentro del directorio docker y ejecutar:

docker-compose up -d

Quiá la primera vez podrías querer ejecutarlo sin la opción -d para ver todo el log que sale (también es cierto que la primera vez se descarga todos los contenedores y tardará un poco). A partir de que haya arrancado podemos acceder a la aplicación en:

http://localhost:8080/miproyecto

También se puede acceder a la base de datos directamente:

mysql -h 127.0.0.1 -u root -p

Y yasta… En próximas entradas veremos como depurar con docker también.

Feliz año nuevo

Una entrada corta, muy corta, para desearos un feliz año 2020… Sea que empecemos los felices años veinte (aunque en el siglo pasado tampoco es que fuesen demasiado felices tampoco) o sea que tengamos que esperar al año que viene para iniciar una nueva década como dice la RAE.

¿Qué espero yo de este nuevo año?

  • Tener, por fin, un proyecto con cierta aceptación (mola tener idéas geniales, pero no mola que nadie te las compre).
  • Dedicarle tiempo al cuidado de la salud, que ya empezamos a tener una edad y no todo va a ser trabajo
  • Recuperar contacto con la famila que, al fin y al cabo, es todo lo que tienes en propiedad para siempre y hay que cuidarlo de vez en cuando.
  • Y, para todo lo demás… No tener más preocupaciones ni miedos que los que ya he tenido, con eso me doy por satisfecho.

Y mis propósitos son…

  • Cabrearme menos (si eso es posible), tendré que empezar a contar hasta 10000 antes de contestar airadamente.
  • Planificar un poco más lo que hago… Que si, que lleva tiempo, pero vale la pena.
  • Buscar gente mejor que yo en todo, colaborar, contratar o aprender de ellas (se acabó el ombliguismo).
  • Perder menos el tiempo con chorradas (esto ya es más complicado, porque mi definición de chorrada es muy esotérica).

En fin… Veremos a ver qué nos depara este año…

Negacionistas

Supongamos que Guillermo es una persona normal, con una carrera técnica en la que sabe un montón de lo suyo y muy poco de lo demás, obviamente no es médico ni nada similar. Un día, en base a unas molestias se pasa por el médico y después de hacerle unas pruebas le diagnostica un cancer.

Guillermo, no contento con el diagnóstico y acojonado como no podía ser de otra manera, decide visitar a otros médicos, solicitar otras opiniones a conocidos oncólogos y todos coinciden en el diagnóstico, cancer. Por suerte es tratable y solo se le pide que empiece el tratamiento cuanto antes.

Pero algo no le cuadra a Guillermo, decide que lo que los médicos han estudiado y a los pacientes que han tratado no son sinónimo de que tengan la razón, intenta documentarse y visita internet con asiduidad, por desgracia el 99% de lo que encuentra le confirma el diagnóstico y el tratamiento. Para el sería una jodienda tener que someterse al tratamiento y decide elegir al 1% que le dice que los médicos están todos compichados con las farmacéuticas para vender carísimos tratamientos contra el cancer y que, en realidad, sus síntomas se curan con agua diluida en principios mágicos…

Guillermo ha decidido que la ciencia médica ya no le sirve, que él y los cuatro iluminados de internet son más listos y ven la verdad más allá de las tramposas multinacionales de las medicinas. Así que se niega a recibir el tratamiento y decide esperar a que el cancer se cure solo con ayuda de medicinas neanthertales. No le ablanda la preocupación de su familia y amigos, él es más listo y nadie ha sabido argumentarle la forma en que las células sanas mutan en cancerígenas de una manera convincente (nada de estudios con cifras, ni causalidadades de esas que se inventan las farmaceúticas)..

Guillermo es feliz sabiendo que él es más listo que los borregos que le rodean aunque sospechosamente su grupo de afectados por la conspiración global de los falsos diagnósticos de cancer va perdiendo miembros a marchas aceleradas, aunque cada día hay nuevos miembros y él activamente evangeliza a todo el que conoce para que evite seguir el tratamiento…

Guillermo muere entre terribles dolores tras un periodo espantoso donde ha perdido el control de sus funciones motoras poco a poco. ¿FIN?

negar

La historia de Guillermo no es ficción, ahora mismo tenemos negacionistas de cualquier cosa que niegan la evidencia y la autoridad de los científicos para casi todo lo que nos ha convertido en una civilización avanzada. No es ya tener una opinión diferente, eso es muy loable, es pensar que su opinión tiene el mismo peso que décadas o cientos de años de estudios e investigaciones y todo se resume en un «Creo que la tierra es plana ¿puedes hacerme cambiar de opinión?»

Merecemos la extinción, pero ya!

Hay algunos que ya se dan cuenta…

La insoportable dependencia de las tiendas de aplicaciones

El avance imparable de la informática en todas las áreas nos ha creado nuevos problemas a los desarrolladores, no ya el hecho de tener que conocer nuevas herramientas cada mes, o nuevos frameworks de desarrollo que tardas más tiempo en aprender que el que te ahorras, sino la pérdida completa del control de lo que tus usuarios pueden instalarse, dónde y cómo. Os pondré un ejemplo.

NoMorePass es una aplicación móvil de la que os llevo hablando bastante y que desarrollamos nosotros; a nivel básico consiste en la app y un conjunto de extensiones para los navegadores que nos permiten intercambiar las contraseñas mediante un código QR. La app ahora mismo tiene su máxima utilidad cuando se usa desde la extensión. Desarrollar una extensión para navegador no es especialmente complicado, como ya os expliqué en esta entrada, probarlas tampoco es difícil con el modo desarrollador de los navegadores, pero una vez que la tenemos lista tenemos que pasar por un infierno inesperado… Ponerla a disposición del público.

Antes se podía distribuir un archivo empaquetado que al abrirse permitía instalar la extensión, pero esa forma de distribuir extensiones se volvió peligrosa (a pesar de que los navegadores preguntaban muchas veces si de verdad querías instalar eso) y Google decidió que para chrome solo se podían instalar extensiones que pasasen por su tienda de aplicaciones el chome web store. Firefox, por su parte, no lo hace obligatorio por el momento, pero la mejor manera de que una extensión se conozca es tenerla en la página de add-ons de firefox. Lo mismo pasa con Opera (aunque esta es otra odiséa que ya os contaré) y, hasta el momento, con Edge.

No tengo nada en contra de las tiendas de aplicaciones mientras estas funcionen de manera ágil y razonable. A efectos prácticos se convierten en cuellos de botella que pueden afectar en gran medida a la forma en la que se produce la distribución de los productos. Como ejemplo valga lo que me ha pasado en las últimas semanas con la extensión de chrome.

El día 19 de noviembre terminé de desarrollar una mejora a la extensión que había en la tienda, pasaba de la versión 2.1.1 a la 3.0.0 y tras probarla en local y funcionando perfectamente intenté subirla al web store… Se quejó que de que pedía demasiados permisos (cosa que no hizo con la versión anterior) y modifiqué la extensión para que funcionase sin necesidad de pedirlos, generé una nueva versión y la subí a toda prisa… Tanta prisa que se me coló un bug que impedía que funcionase el botón derecho (una funcionalidad que se usa mucho cuando la web no está reconocida o queremos rellenar un formulario con una contraseña que tenemos)… Me di cuenta de ello minutos después de haber «publicado» la versión y cuando intenté subir la versión corregida veo que NO ME DEJA... Dice que la extensión está pendiente de revisión y no se puede enviar otra versión. WTF!!!

No había mucho problema, la versión anterior funcionaba perfectamente y las nuevas funcionalidades podían esperar… Así que esperé ¡¡5 DIAS!! a que Google pasara a producción la versión con el bug un sábado por la mañana… Inmediatamente subí la nueva versión (que solo tiene 2 líneas de código distintas con la versión anterior) esperando que se aprobase inmediatamente y que los clientes no tuviesen que sufrir el bug… Pero no, volvieron a poner en revisión la nueva versión y en esas estamos, llevamos ya 4 días con la versión defectuosa de la extensión y con clientes que ya se han quejado… Y no podemos hacer nada, Google nos ha jodido y no nos da ninguna pista de cuando se publicará de verdad la nueva versión.

No hay nada que podamos decir a los clientes, no hay forma de volver a una versión antigua si tenías la auto-actualización de las extensiones (google no guarda las versiones viejas) y no hay forma de acelerar el proceso de publicación. Tampoco hay forma de hablar con Google (he mandado múltiples formularios de contacto con un sonoro silencio por respuesta), tampoco puedo dar un método alternativo para instalar la extensión porque Google obliga a usar su tienda si-o-si, así que no queda más que esperar a que se publique finalmente la nueva versión y disculparnos ante los clientes y asumamos las pérdidas que esto nos pueda ocasionar como algo inevitable… Muy mal google.

ACTUALIZACIÓN 1: 28/11/2019 Google ha leído este post y ha decidido ir un paso más adelante, nos ha RECHAZADO la extensión por pedir más permisos de los que necesitamos (cuando la anterior versión pedía exactamente los mismos)…

Nada, nueva versión pidiendo menos permisos (v3.0.2) y a esperar otros cuatro días (con suerte)…

Me han hackeado el Spotify!

Bueno, realmente a mi no, ha sido a mi hija, ¿pero qué leche? si lo estoy pagando yo también es mío, ¿no?… Como soy un poco vago os reproduzco el hilo de twitter que mandé ayer para que os hagáis una idea:

Ejemplo práctico, de ahora mismo, de porqué es tan malo poner la misma contraseña en sitios distintos… Dentro hilo..

Esta mañana mi hija me ha mandado un whatsapp diciendo que alguien estaba cambiando la música de su spotify y que no podía oir nada de lo que ella ponía… raro.

Al rato me manda pantallazo del correo que ha recibido

Eso ya es indicio claro de que alguien ha entrado en su cuenta y ha cambiado el correo y, obviamente, la contraseña… En este momento estamos pagando el servicio a una persona que no conocemos.

Y que tiene unos gustos musicales pésimos además.

Después de momentos de desconcierto acertamos a dar con el chat de soporte de spotify que, tras pedirnos copia de los justificantes de pago y alguna cosilla más nos devuelve la cuenta. Bien por @SpotifySpain

Para saber lo que ha pasado, le pregunto si usaba la misma contraseña en otros sitios, me dice que si, compruebo en https://haveibeenpwned.com si su email estaba comprometido y… bingo.

Había otros cuatro sitios en internet donde se registro con la misma contraseña que habían sido comprometidos y, probablemente, de uno de ellos haya salido la contraseña que han usado.

Remedio inmediato: usar @nomorepass_ para generar nuevas contraseñas diferentes y cambiarlas en todas partes.

Por eso, amiguitos, nunca debéis usar la misma contraseña (ni ninguna variación simplona de la misma) en ningún sitio… Y, por supuesto, como no vas a poder recordar las contraseñas, usa nomorepass