Docker y timezones

La historia…

Hace unos días tuve un problema con un servicio hecho con Spring Boot y que está desplegado en un docker. Una de las características que tiene el servicio es que inserta una fecha a la base de datos, esta es generada desde el sistema al momento de ejecutar ciertos métodos y la fecha insertada siempre tenía algunas horas de más =[ … huummm Pasadas algunas horas y distintas pruebas para poder encontrar la falla llegué a que no se encontraba en el código de Java … y es que ¿Qué tanto puede fallar crear un Date fecha = new Date() ?

El experimento

Fácil, vamos a ejecutar dos dockers que tengan un simple System.out.println(new Date()), sólo a uno vamos a pasarle un parámetro de timezone y veamos qué pasa.

Fecha.java

import java.util.Date;

public class Fecha {
	public static void main(String[] args) {
		System.out.println(new Date());
	}
}

Docker sin timezone (UTC)

$ docker run -v /home/paklei/fechaTest:/fechaTest -it openjdk:8 /bin/bash
root@89e94d7a48c3:/fechaTest# javac Fecha.java
root@89e94d7a48c3:/fechaTest# java Fecha
Fri Apr 05 00:34:30 UTC 2019

docker con timezone (GTM-6)

$docker run -v /home/paklei/fechaTest:/fechaTest -e TZ="America/Mexico_City" -it openjdk:8 /bin/bash
root@48584dd5a910:/# cd fechaTest/
root@48584dd5a910:/fechaTest# java Fecha
Thu Apr 04 18:34:39 CST 2019

La diferencia fueron 6 horas; tal vez en España este problema no hubiera sido un bug sino un feature, pero en México no nos hizo gracia el tener registros con horas erróneas.

Una cosa más: En caso de que estén usando una imagen Docker de Alpine tal vez necesitarás instalar el paquete tzdata además de los necesarios para que tu aplicación funcione correctamente. Personalmente pienso que si lo que necesitas es desplegar tu aplicación rápidamente o la escalabilidad salvaje no es algo que necesitas resolver para mañana entonces no busques usar imágenes de Alpine o basadas en ella; deja para después ese problema, la optimización se logra con el tiempo pero hasta hoy no he conocido.

Saludos.

comments powered by Disqus