Cómo establecer la zona horaria cuando se utiliza el Python Alpine Docker image
Cuando se utiliza un Python Alpine Docker image debemos añadir el paquete tzdata antes de poder establecer la zona horaria.
Mientras escribía una aplicación en mi plataforma Docker me encontré con un problema inesperado, sí, otro? Esta fue la primera vez que tuve que mostrar la hora en una página de un sitio web que se ejecutaba en Docker y parecía que la hora era UTC en lugar de la hora local. En el código sólo estaba usando las llamadas normales de Python para obtener la hora:
import datetime
...
now = datetime.datetime.now()
hour = now.hour
minute = now.minute
Vivo en los Países Bajos y cuando eran las 9:30 la hora mostrada en la página web era las 8:30. La búsqueda en Internet mostró que los Docker images basados en Ubuntu no tenían este problema. Parecía que el problema era con el Alpine Docker image, estoy usando la imagen 3.6-alpina de Python . El tamaño de esta imagen es pequeño, pero eso se debe a que dejaron de lado mucho! La solución consiste en:
- Añadiendo el paquete tzdata al Docker image
- Ajuste de la zona horaria en el Docker image
Añadir el paquete tzdata es fácil. Utilizo Docker para las construcciones multietapa, por lo que en la primera etapa añadimos tzdata. En la segunda etapa copiamos el directorio zoneinfo de la primera a la segunda etapa. En el archivo Docker también establecemos la zona horaria:
FROM python:3.6-alpine as base
...
RUN apk add --update \
....
tzdata \
...
FROM python:3.6-alpine
...
COPY --from=base /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZ=Europe/Amsterdam
Después de estos cambios, la hora correcta se mostraba en la página. La única desventaja es que esto añade otros pocos MBs.
Enlaces / créditos
Setting the timezone
https://wiki.alpinelinux.org/wiki/Setting_the_timezone
Using local time in a Golang Docker container built from Scratch
https://medium.com/@mhcbinder/using-local-time-in-a-golang-docker-container-built-from-scratch-2900af02fbaf
Recientes
- Cómo ocultar las claves primarias de la base de datos UUID de su aplicación web
- Don't Repeat Yourself (DRY) con Jinja2
- SQLAlchemy, PostgreSQL, número máximo de filas por user
- Mostrar los valores en filtros dinámicos SQLAlchemy
- Transferencia de datos segura con cifrado de Public Key y pyNaCl
- rqlite: una alternativa de alta disponibilidad y dist distribuida SQLite
Más vistos
- Usando Python's pyOpenSSL para verificar los certificados SSL descargados de un host
- Usando UUIDs en lugar de Integer Autoincrement Primary Keys con SQLAlchemy y MariaDb
- Usando PyInstaller y Cython para crear un ejecutable de Python
- Conectarse a un servicio en un host Docker desde un contenedor Docker
- SQLAlchemy: Uso de Cascade Deletes para eliminar objetos relacionados
- Flask RESTful API validación de parámetros de solicitud con esquemas Marshmallow