Comment définir le fuseau horaire lorsque vous utilisez le Python Alpine Docker image
Lorsque vous utilisez un Python Alpine Docker image nous devons ajouter le paquet tzdata avant de pouvoir définir le fuseau horaire.
En écrivant une application sur ma plate-forme Docker , j'ai rencontré un problème inattendu, oui, un autre... C'était la première fois que je devais afficher l'heure sur une page d'un site Web fonctionnant sur Docker et il semblait que l'heure était UTC au lieu de heure locale. Dans le code, j'utilisais juste les appels normaux Python pour obtenir l'heure :
import datetime
...
now = datetime.datetime.now()
hour = now.hour
minute = now.minute
J'habite aux Pays-Bas et quand il était 9h30, l'heure indiquée sur la page web était 8h30. Une recherche sur Internet a montré que les Docker images basés sur Ubuntu n'avaient pas ce problème. Il semble que le problème était avec l'image Alpine Docker image, j'utilise l'image Python 3.6-alpine. La taille de cette image est petite mais c'est parce qu'ils en ont oublié beaucoup ! La solution consiste en :
- Ajout du paquet tzdata au Docker image
- Réglage du fuseau horaire dans le Docker image
L'ajout du paquet tzdata est facile. J'utilise Docker multiphase builds donc dans la première étape on ajoute tzdata. Dans la deuxième étape, nous copions le répertoire zoneinfo de la première étape à la deuxième étape. Dans le fichier Docker, nous réglons également le fuseau horaire :
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
Après ces changements, l'heure correcte était affichée sur la page. Le seul inconvénient est que cela ajoute quelques Mo supplémentaires.
Liens / crédits
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
Récent
- Masquer les clés primaires de la base de données UUID de votre application web
- Don't Repeat Yourself (DRY) avec Jinja2
- SQLAlchemy, PostgreSQL, nombre maximal de lignes par user
- Afficher les valeurs des filtres dynamiques SQLAlchemy
- Transfert de données sécurisé grâce au cryptage à Public Key et à pyNaCl
- rqlite : une alternative à haute disponibilité et dist distribuée SQLite
Les plus consultés
- Utilisation des Python's pyOpenSSL pour vérifier les certificats SSL téléchargés d'un hôte
- Utiliser UUIDs au lieu de Integer Autoincrement Primary Keys avec SQLAlchemy et MariaDb
- Connexion à un service sur un hôte Docker à partir d'un conteneur Docker
- Utiliser PyInstaller et Cython pour créer un exécutable Python
- SQLAlchemy : Utilisation de Cascade Deletes pour supprimer des objets connexes
- Flask RESTful API validation des paramètres de la requête avec les schémas Marshmallow